3

我有一个目录(名为“Top”),其中包含十个子目录(名为“1”、“2”、...“10”),每个子目录都包含大量文本文件。我希望能够打开子目录 2-10 中的所有文件而不打开子目录 1 中的文件。(然后我将打开子目录 1 和 3-10 中的文件而不打开子目录 2 中的文件,等等向前)。现在,我正在尝试使用以下代码读取子目录 2-10 中的文件,而不读取子目录 1 中的文件:

import os, fnmatch

def findfiles (path, filter):
    for root, dirs, files in os.walk(path):
        for file in fnmatch.filter(files, filter):
            yield os.path.join(root, file)

for textfile in findfiles(r'C:\\Top', '*.txt'):
    if textfile in findfiles(r'C:\\Top\\1', '*.txt'):
        pass   
    else:
        filename = os.path.basename(textfile)
        print filename

问题是,这里的 if 语句(“if textfile in findfiles [...]”)不允许我从文本文件列表中排除子目录 1 中的文件。你们有谁知道我可以如何修改我的代码以便只打印子目录 2-10 中这些文件的文件名?如果您能就这个问题提供任何建议,我将不胜感激。

编辑:

如果其他人可能觉得它有帮助,我想发布我最终用来解决这个问题的代码:

import os, fnmatch, glob

for file in glob.glob('C:\\Text\\Digital Humanities\\Packages and Tools\\Stanford Packages\\training-the-ner-tagger\\fixed\*\*'):
    if not file.startswith('C:\\Text\\Digital Humanities\\Packages and Tools\\Stanford Packages\\training-the-ner-tagger\\fixed\\1\\'):
        print file
4

2 回答 2

2

将您的循环更改为:

for textfile in findfiles(r'C:\\Top', '*.txt'):
    if not textfile.startswith(r'C:\\Top\\1'):
        filename = os.path.basename(textfile)
        print filename
于 2013-08-22T00:24:10.480 回答
1

问题很简单,因为您\在常量中使用了额外的 s。改为:

for textfile in findfiles(r'C:\Top', '*.txt'):
    if textfile in findfiles(r'C:\Top\1', '*.txt'):
        pass   
    else:
        filename = os.path.basename(textfile)
        print filename

\\如果您没有使用原始 ( r'') 字符串,那将是正确的。如果这段代码的性能太差,试试:

exclude= findfiles(r'C:\Top\1', '*.txt')
for textfile in findfiles(r'C:\Top', '*.txt'):
    if textfile in exclude:
        pass   
    else:
        filename = os.path.basename(textfile)
        print filename
于 2013-08-22T00:27:00.870 回答