Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取包含名称相同但结尾不同的文件的元组列表_Python - Fatal编程技术网

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

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

我有一个文件夹,其中包含具有相同文件名的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)

但是,我如何才能将该部分与元组列表的生成结合起来,而不必再次遍历文件列表?

根据您的评论,这应该是可行的:

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
循环而不是闭包吗?如果是,则使用字典而不是元组,使用文件名作为键。这将防止通过同一集合进行多次迭代。