我是编程新手,可以提供一些帮助。我正在尝试制作一个程序,它将通过扩展名(多个扩展名)搜索指定目录中的文件,然后只返回在文件名中包含我的关键字列表的特定结果。 我有以下内容:
import os
from fnmatch import fnmatch
root = 'c:\users'
pattern = "*.css"
for path, subdirs, files in os.walk(root):
for name in files:
if fnmatch(name, pattern):
print os.path.join(name)
这将带回一个扩展名的所有文件,在本例中为.css文件,但我需要它来做更多的操作,如图像和文本文件扩展名。我还希望它只返回文件名中包含特定关键字的文件。谁能指出我正确的方向? 感谢
答案 0 :(得分:2)
也许您可以使用glob
:
from glob import glob
for filename in glob('*.css'):
print(filename)
如果您有多个扩展程序,则可以添加glob()
返回的列表:
exts = ['ccs', 'txt']
all = []
for ext in exts:
all += glob('*.' + ext)
for filename in all:
print(filename)
答案 1 :(得分:0)
好的,所以如果你要搜索文件类型和关键字,这里有一些简单的代码:
import os
import re
root = 'c:\users'
pattern = re.compile("((keyword1)|(keyword2))\.((txt)|(jpg))")
for path, subdirs, files in os.walk(root):
for name in files:
if re.match(pattern, name):
print os.path.join(name)
此代码将与文件扩展名txt
或jpg
匹配,并搜索关键字keyword1
和keyword2
。
如果您想制作更加用户友好的代码,轻松添加扩展程序或关键字,您可以使用以下列表:
import os
import re
# configuration information
root = 'C:\Users'
keywords = [ 'one', 'two']
extensions = [ 'jpg', 'txt' ]
use_wildcard = True # Enables you to catch the keyword anywhere in the filename
# end of configuration
keyword_pattern = ''
first = True
for k in keywords:
if use_wildcard:
k = '.*' + k + '.*'
if first:
keyword_pattern += '(' + k + ')'
first = False
else:
keyword_pattern += '|(' + k + ')'
extension_pattern = ''
first = True
for ext in extensions:
if first:
extension_pattern += '(' + ext + ')'
first = False
else:
extension_pattern += '|(' + ext + ')'
pattern_regex = r"({0})\.({1})".format(keyword_pattern, extension_pattern)
print "Searching for: " + pattern_regex
pattern = re.compile(pattern_regex)
for path, subdirs, files in os.walk(root):
for name in files:
if re.match(pattern, name):
print os.path.join(path, name)
我使用正则表达式,因为它们非常强大,并且在很多情况下都很有用。它们一见钟情似乎很复杂,但一旦理解了它们,就很难不使用它们。)