Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.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_Re - Fatal编程技术网

Python 查找文件夹中给定文件名的相应文件扩展名

Python 查找文件夹中给定文件名的相应文件扩展名,python,re,Python,Re,我想实现这样一个功能:输入一个没有扩展名的文件名和一个文件夹的文件列表,然后程序返回带有相应扩展名的全名。例如,我输入“private_car_10”,文件夹的文件列表为: ['private_car_1.png', 'private_car_10.jpg', 'private_car_100.jpeg', 'private_car_101.jpg', 'private_car_102.jpg', 'private_car_103.jpg', 'private_car_104.jpg', 'pr

我想实现这样一个功能:输入一个没有扩展名的文件名和一个文件夹的文件列表,然后程序返回带有相应扩展名的全名。例如,我输入“private_car_10”,文件夹的文件列表为:

['private_car_1.png', 'private_car_10.jpg', 'private_car_100.jpeg', 'private_car_101.jpg', 'private_car_102.jpg', 'private_car_103.jpg', 'private_car_104.jpg', 'private_car_105.jpg', 'private_car_106.jpg', 'private_car_107.jpg', 'private_car_108.jpg', 'private_car_109.jpg', 'private_car_11.jpg', 'private_car_110.jpg', 'private_car_111.jpg', 'private_car_112.jpg', 'private_car_113.jpg', 'private_car_114.jpg', 'private_car_115.jpg', 'private_car_116.jpg', 'private_car_117.jpg', 'private_car_118.jpg', 'private_car_119.jpg', 'private_car_12.jpg', 'private_car_120.jpg', 'private_car_121.jpg', 'private_car_122.jpg', 'private_car_123.jpg', 'private_car_124.jpg', 'private_car_125.jpg', 'private_car_126.jpg', 'private_car_127.jpg', 'private_car_128.jpg', 'private_car_129.jpg', 'private_car_13.jpg', 'private_car_130.jpg', 'private_car_131.jpg', 'private_car_132.jpg', 'private_car_133.jpg', 'private_car_134.jpg', 'private_car_135.jpg', 'private_car_136.jpg', 'private_car_137.jpg', 'private_car_138.jpg', 'private_car_139.jpg', 'private_car_14.png', 'private_car_140.jpg', 'private_car_141.jpg', 'private_car_142.jpg', 'private_car_143.jpg', 'private_car_144.jpg', 'private_car_145.jpg', 'private_car_146.jpg', 'private_car_147.jpg', 'private_car_148.jpg', 'private_car_149.jpg', 'private_car_15.jpg', 'private_car_150.jpg', 'private_car_151.jpg', 'private_car_152.jpg', 'private_car_153.jpg', 'private_car_154.jpg', 'private_car_155.jpg', 'private_car_156.jpg', 'private_car_157.jpg', 'private_car_158.jpg', 'private_car_159.jpg', 'private_car_16.jpg', 'private_car_160.jpg', 'private_car_161.jpg', 'private_car_162.jpg', 'private_car_163.jpg', 'private_car_164.jpg', 'private_car_165.jpg', 'private_car_166.jpg', 'private_car_167.jpg', 'private_car_168.jpg', 'private_car_169.jpg', 'private_car_17.jpg', 'private_car_170.jpg', 'private_car_171.jpg', 'private_car_172.jpg', 'private_car_173.jpg', 'private_car_174.jpg', 'private_car_175.jpg', 'private_car_176.jpg', 'private_car_177.jpg', 'private_car_178.jpg', 'private_car_179.jpeg', 'private_car_18.jpg', 'private_car_180.jpg', 'private_car_181.jpg', 'private_car_182.jpg', 'private_car_183.jpg', 'private_car_184.jpg', 'private_car_185.jpg', 'private_car_186.jpg', 'private_car_187.jpg', 'private_car_188.jpg', 'private_car_189.jpg', 'private_car_19.jpg', 'private_car_190.jpg', 'private_car_191.jpg', 'private_car_192.jpg', 'private_car_193.jpg', 'private_car_194.jpg', 'private_car_195.jpg', 'private_car_196.jpg', 'private_car_197.png', 'private_car_198.jpg', 'private_car_199.jpg', 'private_car_2.jpg', 'private_car_20.jpg', 'private_car_200.jpg']

我希望程序返回“private_car_10.jpg”。我想我可以使用python re模块,但我不知道如何编写模式。

这里不需要正则表达式。假设文件名必须在列表中,只需在“.”上拆分,然后检查文件名是否相等

def find_file_by_name(filename, folder_contents):
    return [file for file in folder_contents if file.rsplit('.', maxsplit=1)[0] == filename]

filename = 'private_car_10'
folder = ['private_car_1.jpg', 'private_car_10.jpg', 'private_car_10.png', 'private_car_100.jpg', 'private_car_101.jpg', 'private_car_102.jpg', 'private_car_103.jpg', 'private_car_104.jpg', 'private_car_105.jpg', 'private_car_106.jpg', 'private_car_107.jpg', 'private_car_108.jpg', 'private_car_109.jpg', 'private_car_11.jpg', 'private_car_110.jpg', 'private_car_111.jpg', 'private_car_112.jpg', 'private_car_113.jpg', 'private_car_114.jpg', 'private_car_115.jpg', 'private_car_116.jpg', 'private_car_117.jpg', 'private_car_118.jpg', 'private_car_119.jpg', 'private_car_12.jpg', 'private_car_120.jpg', 'private_car_121.jpg', 'private_car_122.jpg', 'private_car_123.jpg', 'private_car_124.jpg', 'private_car_125.jpg', 'private_car_126.jpg', 'private_car_127.jpg', 'private_car_128.jpg', 'private_car_129.jpg', 'private_car_13.jpg', 'private_car_130.jpg', 'private_car_131.jpg', 'private_car_132.jpg', 'private_car_133.jpg', 'private_car_134.jpg', 'private_car_135.jpg', 'private_car_136.jpg', 'private_car_137.jpg', 'private_car_138.jpg', 'private_car_139.jpg', 'private_car_14.jpg', 'private_car_140.jpg', 'private_car_141.jpg', 'private_car_142.jpg', 'private_car_143.jpg', 'private_car_144.jpg', 'private_car_145.jpg', 'private_car_146.jpg', 'private_car_147.jpg', 'private_car_148.jpg', 'private_car_149.jpg', 'private_car_15.jpg', 'private_car_150.jpg', 'private_car_151.jpg', 'private_car_152.jpg', 'private_car_153.jpg', 'private_car_154.jpg', 'private_car_155.jpg', 'private_car_156.jpg', 'private_car_157.jpg', 'private_car_158.jpg', 'private_car_159.jpg', 'private_car_16.jpg', 'private_car_160.jpg', 'private_car_161.jpg', 'private_car_162.jpg', 'private_car_163.jpg', 'private_car_164.jpg', 'private_car_165.jpg', 'private_car_166.jpg', 'private_car_167.jpg', 'private_car_168.jpg', 'private_car_169.jpg', 'private_car_17.jpg', 'private_car_170.jpg', 'private_car_171.jpg', 'private_car_172.jpg', 'private_car_173.jpg', 'private_car_174.jpg', 'private_car_175.jpg', 'private_car_176.jpg', 'private_car_177.jpg', 'private_car_178.jpg', 'private_car_179.jpg', 'private_car_18.jpg', 'private_car_180.jpg', 'private_car_181.jpg', 'private_car_182.jpg', 'private_car_183.jpg', 'private_car_184.jpg', 'private_car_185.jpg', 'private_car_186.jpg', 'private_car_187.jpg', 'private_car_188.jpg', 'private_car_189.jpg', 'private_car_19.jpg', 'private_car_190.jpg', 'private_car_191.jpg', 'private_car_192.jpg', 'private_car_193.jpg', 'private_car_194.jpg', 'private_car_195.jpg', 'private_car_196.jpg', 'private_car_197.jpg', 'private_car_198.jpg', 'private_car_199.jpg', 'private_car_2.jpg', 'private_car_20.jpg', 'private_car_200.jpg']

res = find_file_by_name(filename, folder)
print(res)  # produces ['private_car_10.jpg', 'private_car_10.png']
我在这里做的是遍历文件夹中的文件列表。然后,我在“.”子字符串上拆分文件夹中的每个文件,这将生成一个[filename,extension]序列,如果文件名与函数输入匹配,我将该文件包含在要返回的列表中。我只使用rsplit和split一次,以便允许文件名包含“.”字符

见文件:


最有效的方法是首先将列表转换为字典

import os
files = ['private_car_1.jpg', 'private_car_10.jpg', 'private_car_100.jpg', 'private_car_101.jpg', 'private_car_102.jpg', 'private_car_103.jpg'] 

di = {os.path.splitext(el)[0] : el for el in files}

print(di.get('private_car_100'))
输出:

private_car_100.jpg

您是否打算将“私家车40”排除在列表中?您想基于相似的文件名为生成文件扩展名吗?这就是你要问的吗?实际上文件列表很长,所以我截短到了前200个元素,所以事实上,有private_car_40.jpg。我已经更新了问题描述。再次抱歉~很抱歉,我没有清楚地说扩展名是文件夹,不总是相同的,可能有jpg、png、jpeg或else@WadeWANG我用一个最起码的工作示例更新了我的答案。该函数现在生成所有匹配文件名的列表,无论其扩展名如何。此解决方案的问题是,如果文件名包含多个句点,它将中断。@LevB Nope,修复了它。此解决方案很简洁,但它确实创建了另一个字典。如果列表非常长,如OP所述,则会消耗更多内存,而python虚拟机在运行时将永远占用这些内存。然而,我不确定OP的用例是什么。我只是想指出这一点。下面是一篇关于python内存管理的好文章:如果内存有问题,只需删除原始列表。不会丢失任何信息。只要运行,Python仍将无限期地声明其vm中的内存。我只是想指出这一点,但我们不能确定这是否是一个问题。你的解决方案比我的可读性强得多。请让我投票。