我正在尝试使用通用模式过滤所有文件。为什么我不能放置可变模式进行过滤。
listOfFiles = os.listdir('.')
casenr = str(nr)
pattern = "*"+str(nr)+"_*.state"
for entry in listOfFiles:
if fnmatch.fnmatch(entry, pattern):
statefile = entry
print(statefile)
我希望找到一个名为
的文件init_8_abc.txt
答案 0 :(得分:1)
您为什么不只使用glob
?按照您的示例,您可以执行以下操作:
import glob
pattern = f'/path/to/directory/with/files/*{str(nr)}_*.state'
files = glob.glob(pattern)
for file in files:
doSomething(file)
glob
允许使用*
通配符搜索具有特定模式的文件(您可以在模式的任何部分使用通配符,例如在多个子目录中搜索)。请参见How to Analyze Java SSL Errors。
另外,请注意,只有python> 3.6支持使用f字符串。
答案 1 :(得分:0)
这应该有效。您的代码只会打印 last 匹配项,但是,因为每次找到匹配项,它都会用该匹配项覆盖statefile
。将statefile设为列表,然后执行statefile.append(entry)
,您将获得所有匹配项的列表。
这对我有用:
import os, fnmatch
listOfFiles = os.listdir('.')
pattern = "*"+"1"+"*"
statefile = []
for entry in listOfFiles:
if fnmatch.fnmatch(entry, pattern):
statefile.append(entry)
print(statefile)
答案 2 :(得分:0)
您可以使用正则表达式为文件名列表构建一些平凡的过滤器:
import re
filenames = [
"_filename_example1",
"_filename_examples",
"filename_example2",
"_filename_example_",
]
regex = re.compile("_.*\d")
selected = filter(regex.match, filenames)
for s in selected:
print(s)
给出的示例仅显示 _filename_example1 ,因为它以 _ 开头,以 number 结尾。
答案 3 :(得分:0)
import os
import re
listOfFiles = os.listdir('.')
nr = '<wherever this is coming from>'
for filename in listOfFiles:
foundFiles = re.findall('^[\\w]+_' + str(nr) + '_[\\w.]+', filename)
print(foundFiles)