【发布时间】:2019-11-29 15:21:58
【问题描述】:
所以我有 2 个具有 2 种不同文件类型(例如 .csv、.png)但具有相同基本名称(例如 1001_12_15.csv、1001_12_15.png)的目录。我在每个目录中有数千个文件。
我想要做的是在匹配基本名称之后获取文件的完整路径,然后对两个文件的完整路径执行一些操作。
我正在寻求有关如何加快该过程的帮助。
我的做法是:
csvList=[a list with the full path of each .csv file]
pngList=[a list with the full path of each .png file]
for i in range(0,len(csvlist)):
csv_base = os.path.basename(csvList[i])
#eg 1001
csv_id = os.path.splitext(fits_base)[0].split("_")[0]
for j in range(0, len(pngList)):
png_base = os.path.basename(pngList[j])
png_id = os.path.splitext(png_base)[0].split("_")[0]
if float(png_id) == float(csv_id):
DO SOMETHING
我试过 fnmatch 之类的东西:
for csv_file in csvList:
try:
csv_base = os.path.basename(csv_file)
csv_id = os.path.splitext(csv_base)[0].split("_")[0]
rel_path = "/path/to/file"
pattern = "*" + csv_id + "*.png"
reg_match = fnmatch.filter(pngList, pattern)
reg_match=" ".join(str(x) for x in reg_match)
if reg_match:
DO something
似乎使用嵌套的 for 循环更快。但我希望它更快。还有其他方法可以加快我的代码速度吗?
【问题讨论】:
-
png = glob.glob(".png") , csv = glob.glob(".csv")
-
有一些示例数据会很高兴
-
列表推导通常比循环更简洁、更快
-
您不必要地搜索完全匹配。为什么不检查给定 csv 的 png 是否确实存在?如果您想在内存中执行此操作,为什么不使用集合进行 O(1) 查找?
-
您的描述提到文件匹配整个名称,但扩展名。您的代码仅在下划线之前比较基本名称的开头。你在找什么样的比赛?
标签: python performance for-loop match fnmatch