查找列表项是否在文件名中
Finding if a list item is in a filename
假设我有一个文件名:D_Passaic_F01_NBR_E0003.tif
位于我正在使用 Python 遍历的文件夹中。假设我想获取 E0001 到 E0010 之间的所有文件。我可能会列出如下列表:select_libr = ['E0001', 'E0002', 'E0003', 'E0003', 'E0005', 'E0006', 'E0007', 'E0008', 'E0009', 'E0010']
。使用此列表,我如何检查文件名将遍历目录以仅提取那些关键文件?
for filename in os.listdir(directory):
if (filename.startswith("D_")) and (filename.endswith(".tif") or filename.endswith(".tiff")):
print(os.path.join(directory, filename))
else:
continue
我想做的是:...and (item in select_libr in filename)
但我不确定这里的语法是否正确。有什么建议吗?
您可以使用正则表达式从 Exxx
中提取数字,然后用它做您想做的事。例如,
E(\d+)\.tiff?$
将匹配 E
,然后是一个或多个数字,然后是 .tif
,然后是字符串末尾的可选 f
。更重要的是,它将数字捕获为一组,并允许我们仅从匹配对象中提取数字。 Try it
for filename in os.listdir(directory):
research = re.search(r"E(\d+)\.tiff?", filename)
if research: # If there was a match
fnum = research.group(1) # This is the string "0003", for example
# Then do whatever you want with it
if 0 <= int(fnum) <= 10:
print(filename)
如果您想要允许任意值,我强烈建议使用 set
而不是 list
来存储这些值,因为检查集合中的成员资格比检查列表中的成员资格便宜。
select_libr = {'E0001', 'E0002', 'E0003', 'E0003', 'E0005', 'E0006', 'E0007', 'E0008', 'E0009', 'E0010'}
并更改正则表达式,以便 E
也被捕获:(E\d+)\.tiff?
Try it
for filename in os.listdir(directory):
research = re.search(r"(E\d+)\.tiff?", filename)
if research: # If there was a match
fnum = research.group(1) # This is the string "E0003", for example
# Then do whatever you want with it
if fnum in select_libr:
print(filename)
为了确保您的文件名以 D_
开头,您可以将 ^D_.*?
添加到其他正则表达式之前。这会在字符串的开头查找 D_
,后跟任何字符。其他一切都可以保持不变。 Try it
假设我有一个文件名:D_Passaic_F01_NBR_E0003.tif
位于我正在使用 Python 遍历的文件夹中。假设我想获取 E0001 到 E0010 之间的所有文件。我可能会列出如下列表:select_libr = ['E0001', 'E0002', 'E0003', 'E0003', 'E0005', 'E0006', 'E0007', 'E0008', 'E0009', 'E0010']
。使用此列表,我如何检查文件名将遍历目录以仅提取那些关键文件?
for filename in os.listdir(directory):
if (filename.startswith("D_")) and (filename.endswith(".tif") or filename.endswith(".tiff")):
print(os.path.join(directory, filename))
else:
continue
我想做的是:...and (item in select_libr in filename)
但我不确定这里的语法是否正确。有什么建议吗?
您可以使用正则表达式从 Exxx
中提取数字,然后用它做您想做的事。例如,
E(\d+)\.tiff?$
将匹配 E
,然后是一个或多个数字,然后是 .tif
,然后是字符串末尾的可选 f
。更重要的是,它将数字捕获为一组,并允许我们仅从匹配对象中提取数字。 Try it
for filename in os.listdir(directory):
research = re.search(r"E(\d+)\.tiff?", filename)
if research: # If there was a match
fnum = research.group(1) # This is the string "0003", for example
# Then do whatever you want with it
if 0 <= int(fnum) <= 10:
print(filename)
如果您想要允许任意值,我强烈建议使用 set
而不是 list
来存储这些值,因为检查集合中的成员资格比检查列表中的成员资格便宜。
select_libr = {'E0001', 'E0002', 'E0003', 'E0003', 'E0005', 'E0006', 'E0007', 'E0008', 'E0009', 'E0010'}
并更改正则表达式,以便 E
也被捕获:(E\d+)\.tiff?
Try it
for filename in os.listdir(directory):
research = re.search(r"(E\d+)\.tiff?", filename)
if research: # If there was a match
fnum = research.group(1) # This is the string "E0003", for example
# Then do whatever you want with it
if fnum in select_libr:
print(filename)
为了确保您的文件名以 D_
开头,您可以将 ^D_.*?
添加到其他正则表达式之前。这会在字符串的开头查找 D_
,后跟任何字符。其他一切都可以保持不变。 Try it