有没有办法通过文件名中的可变字符串过滤文件?

时间:2019-07-17 12:52:41

标签: python

我正在尝试使用通用模式过滤所有文件。为什么我不能放置可变模式进行过滤。

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

4 个答案:

答案 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)

相关问题