列表搜索中的文件名字符串比较失败[Python]

时间:2016-12-09 08:16:57

标签: python

我正在尝试关联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.

中的所有文件名

出于隐私原因,我没有发布整个文件路径,只发布文件的名称。在此示例中,比较有效,但整个文件路径失败

我认为我的比较条件不正确,但我不知道如何写它。

注意:我正在寻找尽可能少的代码行来做这件事。

4 个答案:

答案 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]