2

我是个 Python 新手

我需要遍历一个目录来查找 .txt 文件,然后单独读取和处理它们。我想设置它,以便脚本所在的任何目录都被视为此操作的根目录。例如,如果脚本位于 /bsepath/workDir 中,那么它将遍历 workDir 及其子项中的所有文件。

到目前为止,我所拥有的是:

#!/usr/bin/env python

import os

scrptPth = os.path.realpath(__file__)

for file in os.listdir(scrptPth)
    with open(file) as f:
        head,sub,auth = [f.readline().strip() for i in range(3)]
        data=f.read()
        #data.encode('utf-8')

pth = os.getcwd()

print head,sub,auth,data,pth

这段代码给了我一个无效的语法错误,我怀疑这是因为os.listdir不喜欢标准字符串格式的文件路径。另外我不认为我正在做正确的循环动作。如何在循环操作中引用特定文件?是否打包为变量?

任何帮助都会得到帮助

4

2 回答 2

11
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:\Users\poke\Documents', '*.txt'):
    print(textFile)
于 2012-11-08T23:40:30.750 回答
3

os.listdir需要一个目录作为输入。因此,要获取脚本所在的目录,请使用:

scrptPth = os.path.dirname(os.path.realpath(__file__))

此外,os.listdir仅返回文件名,而不是完整路径。open(file)除非当前工作目录恰好是脚本所在的目录,否则将无法正常工作。要解决此问题,请使用os.path.join

import os

scrptPth = os.path.dirname(os.path.realpath(__file__))

for file in os.listdir(scrptPth):
    with open(os.path.join(scrptPth, file)) as f:

最后,如果您想通过子目录进行递归,请使用os.walk

import os

scrptPth = os.path.dirname(os.path.realpath(__file__))

for root, dirs, files in os.walk(scrptPth):
    for filename in files:
        filename = os.path.join(root, filename)
        with open(filename, 'r') as f:
            head,sub,auth = [f.readline().strip() for i in range(3)]
            data=f.read()
            #data.encode('utf-8')
于 2012-11-08T23:32:20.373 回答