我有一个文件列表 - 前两个文件名相同,但目录路径不同。状态代码(例如CA或OK)也包括在目录路径中。
files = [r'C:\temp\OK\somefile_1234_nw.tif',
r'C:\temp\test\CA\somefile_1234_nw.tif',
r'C:\temp\OK\somefile_9999_nw.tif']
我可以使用以下生成器表达式提取具有特定文件名的第一个文件:
search_string = 'somefile_1234_nw.tif'
print next((s for s in files if search_string in s), None)
如何从两个搜索字符串中提取包含项目的文件 - ' CA'和' somefile_1234_nw.tif' - 使用我的生成器表达式?在这种情况下,处理效率很重要,因为我的扩大问题有数千个项目。
预期输出为:
'C:\temp\test\CA\somefile_1234_nw.tif'
答案 0 :(得分:1)
你的意思是这样吗?
>>> next((s for s in files if all(i in s for i in['somefile_1234_nw.tif', 'CA'])), None)
'C:\\temp\\test\\CA\\somefile_1234_nw.tif'
all()
检查迭代器中的所有元素是否为True
,如果是,则返回True
,否则返回False
。
答案 1 :(得分:1)
这样的事情应该有效:
search_strings = ['somefile_1234_nw.tif', 'CA']
print next((s for s in files if all([search_string in s for search_string in search_strings])), None)
答案 2 :(得分:1)
由于您正在寻找速度,因此发电机可能不是最佳选择。生成器很好,有几个原因,比如当你要用完内存或者在你得到下一个答案之前需要做额外的处理时。
对于1000件物品或甚至数百万件物品的速度:你会想要使用熊猫系列。 (因为1000个项目将适合您机器的内存。)
import pandas as pd
files = pd.Series([r'C:\temp\OK\somefile_1234_nw.tif',
r'C:\temp\test\CA\somefile_1234_nw.tif',
r'C:\temp\OK\somefile_9999_nw.tif'])
pattern2 = 'CA'
pattern1 = 'somefile_1234_nw.tif'
mask1 = files.str.contains(pattern1)
files2 = files[mask1]
mask2 = files2.str.contains(pattern2)
files2[mask2].values
我很想听听你的数据的时间安排。