【问题标题】:Py Search files in Folder and SubfoldersPy 在文件夹和子文件夹中搜索文件
【发布时间】:2012-03-14 16:58:47
【问题描述】:

我正在尝试在目录树中查找文件列表。本质上,我提供了一个文本文件,其中包含我想要搜索的所有术语 (~500),并让它在目录和子目录中查找它们。但是,我有问题 - 我相信 - 代码采取和过早结束的步骤而没有在所有文件夹中搜索。

我使用的代码是(pattern 是文本文件的名称):

import os

def locateA(pattern, root):
    file  = open(pattern, 'r')
    for path, dirs, files in os.walk(root):
        for word in files:
            for line in file:
                if line.strip() in word:
                    print os.path.join(path, word), line.strip()

关于我错在哪里的任何想法?

【问题讨论】:

  • 我建议使用构造 with open(pattern, 'rU') as f: 并且不要调用你的文件 file 因为 file 是内置模块中的一个类。
  • 将文件名更改为其他名称。我会调查你提到的结构。
  • 那么问题的症状究竟是什么?

标签: python file search directory


【解决方案1】:

问题的全部或部分可能是您只能遍历文件一次,除非您使用file.seek() 重置文件中的当前位置。

确保在尝试再次循环之前返回文件的开头:

import os

def locateA(pattern, root):
    file  = open(pattern, 'r')
    for path, dirs, files in os.walk(root):
        for word in files:
            file.seek(0)             # this line is new
            for line in file:
                if line.strip() in word:
                    print os.path.join(path, word), line.strip()

【讨论】:

  • 啊哈!,好像这行得通。不知道你只能迭代一次
  • 没问题,如果我的回答对您有帮助,您可以通过单击答案旁边的复选标记的轮廓accept it
【解决方案2】:

for line in file 第一次使用file 中的行,然后每次都为空。

试试这个,它可以解决这个问题和其他一些问题:

import os

def locateA(pattern, root):
    patterns = open(pattern, 'r').readlines() # patterns is now an array, no need to reread every time.
    for path, dirs, files in os.walk(root):
        for filename in files:
            for pattern in patterns:
                if pattern.strip() in filename:
                    print os.path.join(path, filename), pattern.strip()

【讨论】:

  • 快速提问,为什么我在代码中需要filecontent = open(file,'r').read()?这会打开目录中的每个文件吗?
  • 抱歉,我误读了您的问题,并认为您想在每个文件中执行相当于 grep 的内容。我现在看到您实际上正在匹配文件名。我更正了这个例子。