Python 获取包含名称相同但结尾不同的文件的元组列表
我有一个文件夹,其中包含具有相同文件名的json和jpeg文件对。基于此文件夹,我想创建一个包含对的元组列表,如下所示:Python 获取包含名称相同但结尾不同的文件的元组列表,python,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
[('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)
但是,我如何才能将该部分与元组列表的生成结合起来,而不必再次遍历文件列表?根据您的评论,这应该是可行的:
files, tuples = list(), list()
for targetFile in os.listdir('Z:/data'):
if re.match('.*\.json|.*\.jpg', targetFile):
files.append(targetFile)
tuples.append((...))
…在省略号中放置提取文件名并附加结尾的代码。根据您的注释,这应该可以工作:
files, tuples = list(), list()
for targetFile in os.listdir('Z:/data'):
if re.match('.*\.json|.*\.jpg', targetFile):
files.append(targetFile)
tuples.append((...))
…在省略号中,您放置了提取文件名并附加结尾的代码。感谢@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)
感谢@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)
如果你正在寻找一种紧凑的方法 注意,它返回的是列表列表而不是元组列表
# 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']]
如果你正在寻找一种紧凑的方法 注意,它返回的是列表列表而不是元组列表
# 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']]
我发布的代码片段创建了一个包含文件夹中所有json和jpeg文件的列表。我实际上需要的是一个元组列表,其中元组包含名称相同但结尾不同的所有文件(如我发布的示例列表)。我如何修改代码来实现这一点?难道你不能使用常规的
for
循环而不是闭包吗?如果是,则使用字典而不是元组,使用文件名作为键。我发布的代码片段创建了一个包含文件夹中所有json和jpeg文件的列表。我实际上需要的是一个元组列表,其中元组包含名称相同但结尾不同的所有文件(如我发布的示例列表)。我如何修改代码来实现这一点?难道你不能使用常规的for
循环而不是闭包吗?如果是,则使用字典而不是元组,使用文件名作为键。这将防止通过同一集合进行多次迭代。