【问题标题】:search for keywords in file directory在文件目录中搜索关键字
【发布时间】:2021-06-09 14:47:05
【问题描述】:

我很难从预定列表中找到包含关键字的文件名。我设法从目录和子目录中找到所有文件,但是查找关键字不起作用。我想列出我目录中名称中包含关键字的所有文件:

path = ':O drive'
keywords = ['photo', 'passport', 'license']
files = [] # list of all files in directory
result = []  # list store our results

#list all files
for root, directories, file_path in os.walk(path, topdown=False):
        for name in file_path:
            files.append(os.path.join(root, name))

#find keywords in files            
for filename in files:
    for keyword in keywords:
        if keyword in filename:
            result[keyword].os.path.join(path, filename)

print(result)

【问题讨论】:

  • 听起来您希望 result 类似于 defaultdict(list) 而不是列表,然后您可以执行 result[keyword].append(os.path.join(path,filename))
  • 你能试试这个吗? if keyword in str(filename)

标签: python os.walk os.path


【解决方案1】:

您可以为此使用 glob,用每个循环的关键字替换该模式。这将创建一个列表的字典。在这种情况下,我在脚本的工作目录中有 1 个名为 photo.txt 的文件和 2 个名为 license 2019.txtlicense 2020.txt 的文件。

from glob import glob
import os
keywords = ['photo','license', 'passport']

path = './'

output = {}
for word in keywords:
    output[word] = glob(os.path.join(path,f'*{word}*'))

输出

{'photo': ['.\\photo.txt'],
 'license': ['.\\license 2019.txt', '.\\license 2020.txt'],
 'passport': []}

【讨论】:

  • 谢谢,这行得通!但是,它不会找到子目录中的文件。我如何将代码中的“#list all files”部分应用于此?
【解决方案2】:

如果您只想要包含列表中任何关键字的文件名列表,请尝试列表理解:

result = [os.path.join(path, f) for f in files if any(k in f.lower() for k in keywords)]

如果您想要字典,请改为:

result = dict()
for k in keywords:
    result[k] = [os.path.join(path, f) for f in files if k in f.lower()]

【讨论】:

    【解决方案3】:
    import os
    for dirpath, dirs, files in os.walk(":O drive"): 
      keywords=['photo', 'passport', 'license','file']
      for filename in files:
        f = os.path.join(dirpath,filename)
        for keyword in keywords:        
          if keyword in f:
              try:
                print(f)
              except OSError as e:
                print("Error: %s : %s" % (f, e.strerror))
    

    这是我针对您的问题提出的解决方案。它还显示了我们正在搜索的文件的完整路径,如果发生异常情况,请使用 try and catch。

    【讨论】:

      【解决方案4】:

      您可以使用正则表达式。

      >>> import re
      >>> keywords = ['photo', 'passport', 'license']
      >>> m = re.findall(f"^.*[{'|'.join(keywords)}].*$", 'example-photo.jpg')
      >>> m
      ['example-photo.jpg']
      

      https://docs.python.org/3/library/re.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-07
        • 1970-01-01
        • 2014-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多