我正在尝试关联Python中2个list
元素的一些文件路径。这些文件的名称部分相同,而扩展名和一些额外的单词则不同。
这意味着文件的扩展名,额外字符及其位置可能不同。这些文件位于不同的文件夹中,因此它们的文件路径名称不同。完全相同的是:他们的编号索引:0033
,例如0061
。
示例代码:
original_files = ['C:/0001.jpg',
'C:/0033.jpg',
'C:/0061.jpg',
'C:/0080.jpg',
'C:/0204.jpg',
'C:/0241.jpg']
related_files = ['C:/0001_PM.png',
'C:/0033_PMA.png',
'C:/0033_NM.png',
'C:/0061_PMLTS.png',
'C:/0080_PM.png',
'C:/0080_RS.png',
'C:/0204_PM.png']
for idx, filename in enumerate(original_files):
related_filename = [s for s in (related_files) if filename.rsplit('/',1)[1][:-4] in s]
print(related_filename)
在filename = 'C:/0241.jpg'
它应该返回[]
,但它会返回related_files.
出于隐私原因,我没有发布整个文件路径,只发布文件的名称。在此示例中,比较有效,但整个文件路径失败。
我认为我的比较条件不正确,但我不知道如何写它。
注意:我正在寻找尽可能少的代码行来做这件事。
答案 0 :(得分:0)
对于python 3.X,您可以尝试使用它:
for origfiles in original_files:
for relfiles in related_files:
if origfiles[3:6] == relfiles[3:6]:
print(origfiles)
答案 1 :(得分:0)
使用defaultdict。
import os, re
from collections import defaultdict
stragglers = []
grouped_files = defaultdict(list)
file_index = re.compile('([0-9]+)')
for f in original_files + related_files:
m = file_index.match(os.path.split(f)[1])
if m:
grouped_files[m.group(1)].append(f)
else:
stragglers.append(f)
您现在拥有grouped_files
,一个键值对的字典(或类字典对象),其中键是文件名的正则表达式匹配部分,值是匹配文件名的列表。
for x in grouped_files.items():
print(x)
# ('0204', ['C:/0204.jpg', 'C:/0204_PM.png'])
# ('0001', ['C:/0001.jpg', 'C:/0001_PM.png'])
# ('0033', ['C:/0033.jpg', 'C:/0033_PM.png'])
# ('0061', ['C:/0061.jpg', 'C:/0061_PM.png'])
# ('0241', ['C:/0241.jpg'])
# ('0080', ['C:/0080.jpg', 'C:/0080_PM.png'])
在stragglers
中,您有任何与正则表达式不匹配的文件名。
print(stragglers)
# []
答案 2 :(得分:0)
我建议采用
的方式from collections import defaultdict
original_files = ['C:/0001.jpg',
'C:/0033.jpg',
'C:/0061.jpg',
'C:/0080.jpg',
'C:/0204.jpg',
'C:/0241.jpg']
related_files = ['C:/0001_PM.png',
'C:/0033_PMA.png',
'C:/0033_NM.png',
'C:/0061_PMLTS.png',
'C:/0080_PM.png',
'C:/0080_RS.png',
'C:/0204_PM.png']
def key1(filename):
return filename.rsplit('/', 1)[-1].rsplit('.', 1)[0]
def key2(filename):
return key1(filename).split('_', 1)[0]
d = defaultdict(list)
for x in related_files:
d[key2(x)].append(x)
for x in original_files:
related = d.get(key1(x), [])
print(x, '->', related)
在key1()
和key2()
中,您可以使用os.path
函数或pathlib.Path
方法。
答案 3 :(得分:0)
Here's a solution that returns only the matched relative_files.
import os, re
def get_index(filename):
m = re.match('([0-9]+)', os.path.split(filename)[1])
return m.group(1) if m else False
indexes = filter(bool, map(get_index, original_files))
[f for f in related_files if get_index(f) in indexes]