Python 如何递归地遍历所有子目录并读取文件?

Python 如何递归地遍历所有子目录并读取文件?,python,file,Python,File,我有一个包含多个子目录的根目录,所有子目录都包含一个文件名data.txt。我想做的是编写一个脚本,它接收“root”目录,然后读取所有子目录,读取子目录中的每个“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.wa

我有一个包含多个子目录的根目录,所有子目录都包含一个文件名data.txt。我想做的是编写一个脚本,它接收“root”目录,然后读取所有子目录,读取子目录中的每个“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'
文件“recursive.py”,第11行,在
打开(文件,'r')作为fin:
IOError:[Errno 2]没有这样的文件或目录:“data.txt”

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

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

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()
一种功能性的方法使树看起来更短、更干净、更像蟒蛇


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

只是一个样式注释:一旦嵌套如此深入,可能很难读取。为了简化,我将内部部分放在一个单独的
defdo_文件(文件名):…
函数中。如果文件=='data.txt',也可以执行
操作:继续
以简化并保存一个级别。另请参见:“扁平比嵌套好”。如果,像我一样,任何阅读本文的人都想额外过滤正在迭代的文件名,那么这个问题的答案证明非常有用:解决如何获得此链接。
[os.path.join(dirpath, filename) for dirpath, dirnames, filenames in os.walk(rootdir) 
                                 for filename in filenames]