获取包含具有相同名称但结尾不同的文件的元组列表

时间:2018-06-01 07:07:02

标签: python

我有一个文件夹,其中包含一对具有相同文件名的json和jpeg文件。基于此文件夹,我想创建一个包含对的元组列表,如下所示:

[('first.json','first.jpg'),('second.json','second.jpg')...('last.json','last.jpg')]

只过滤json和jpg文件很简单:

import os
import re
files = [targetFile for targetFile in os.listdir('Z:/data') if re.match('.*\.json|.*\.jpg', targetFile)]
print(files)

但是如何将该部分与元组列表的生成相结合,而无需再次遍历文件列表?

3 个答案:

答案 0 :(得分:1)

根据您的意见,这应该有效:

files, tuples = list(), list()
for targetFile in os.listdir('Z:/data'):
    if re.match('.*\.json|.*\.jpg', targetFile):
        files.append(targetFile)
        tuples.append((...))

...在省略号中,您可以放置​​提取文件名的代码并附加结尾。

答案 1 :(得分:1)

感谢@John Perry,他提醒我风格不应该优先于功能,我想出了以下简单的解决方案:

import os
from collections import defaultdict
listOfRelevantFiles = defaultdict(list)
for targetFile in os.listdir('Z:/data'):
    if '.jpg' in targetFile or '.json' in targetFile:
        listOfRelevantFiles[targetFile.split('.')[0]].append(targetFile)
print(listOfRelevantFiles) 

答案 2 :(得分:0)

如果您正在寻找这种紧凑的方式,

ps:请注意,这将返回列表列表而不是元组列表

# bunch of files os.listdir() returns
files = ['first.jpg', 'first.json', 'second.jpg', 'second.json']

print([re.findall(fileName + r'(?:.jpg|.json)', ' '.join(files)) \
       for fileName in set(re.findall(r'(\w*?)(?:\.jpg|\.json)', ' '.join(files)))])

# [['second.jpg', 'second.json'], ['first.jpg', 'first.json']]