我有一个文件夹,其中包含一对具有相同文件名的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)
但是如何将该部分与元组列表的生成相结合,而无需再次遍历文件列表?
答案 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']]