33

我有一个根目录,其中包含多个子目录,所有子目录都包含一个文件名 data.txt。我想做的是编写一个脚本,该脚本接受“根”目录,然后读取所有子目录并读取子目录中的每个“data.txt”,然后将每个 data.txt 文件中的内容写入一个输出文件。

这是我的代码片段:

import os
import sys
rootdir = sys.argv[1]

with open('output.txt','w') as fout:
    for root, subFolders, files in os.walk(rootdir):
        for file in files:
            if (file == 'data.txt'):
                #print file
                with open(file,'r') as fin:
                    for lines in fin:
                        dosomething()

我的 dosomething() 部分——如果我只为一个文件运行该部分,我已经测试并确认它可以工作。我还确认,如果我告诉它打印文件(注释掉的行),脚本会打印出“data.txt”。

现在,如果我运行它,Python 会给我这个错误:

File "recursive.py", line 11, in <module>
    with open(file,'r') as fin:
IOError: [Errno 2] No such file or directory: 'data.txt'

我不确定为什么找不到它——毕竟,如果我取消注释“打印文件”行,它会打印出 data.txt。我做错了什么?

4

2 回答 2

55

您需要使用绝对路径,您的file变量只是没有目录路径的本地文件名。变量是该root路径:

with open('output.txt','w') as fout:
    for root, subFolders, files in os.walk(rootdir):
        if 'data.txt' in files:
            with open(os.path.join(root, 'data.txt'), 'r') as fin:
                for lines in fin:
                    dosomething()
于 2012-11-26T18:48:15.333 回答
0
[os.path.join(dirpath, filename) for dirpath, dirnames, filenames in os.walk(rootdir) 
                                 for filename in filenames]

一种获得树的功能性方法看起来更短、更干净、更 Pythonic。

您可以将其包装os.path.join(dirpath, filename)到任何函数中以处理您获取的文件或保存路径数组以供进一步处理

于 2018-02-10T11:34:55.520 回答