首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python递归文件夹读取

Python递归文件夹读取
EN

Stack Overflow用户
提问于 2010-02-06 17:24:39
回答 16查看 335.1K关注 0票数 283

我有C++/Obj-C背景,我刚刚开始学习Python (我已经写了大约一个小时了)。我正在编写一个脚本来递归地读取文件夹结构中的文本文件的内容。

我的问题是,我写的代码只适用于一个文件夹深度。我可以在代码中看到为什么(参见#hardcoded path),我只是不知道如何才能继续使用Python,因为我对它的体验只是全新的。

Python代码:

import os
import sys

rootdir = sys.argv[1]

for root, subFolders, files in os.walk(rootdir):

    for folder in subFolders:
        outfileName = rootdir + "/" + folder + "/py-outfile.txt" # hardcoded path
        folderOut = open( outfileName, 'w' )
        print "outfileName is " + outfileName

        for file in files:
            filePath = rootdir + '/' + file
            f = open( filePath, 'r' )
            toWrite = f.read()
            print "Writing '" + toWrite + "' to" + filePath
            folderOut.write( toWrite )
            f.close()

        folderOut.close()
EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2010-02-06 17:48:17

确保理解os.walk的三个返回值

for root, subdirs, files in os.walk(rootdir):

有以下含义:

  • root:当前路径为"walked through"
  • subdirs:Files in root of directory
  • files:Files in root (not in subdirs) of directory

“类型的目录中的文件

请使用os.path.join,而不是用斜杠连接!你的问题是filePath = rootdir + '/' + file -你必须连接当前的"walked“文件夹,而不是最上面的文件夹。所以那一定是filePath = os.path.join(root, file)。顺便说一句,"file“是一个内置的,所以你通常不会使用它作为变量名。

另一个问题是你的循环,它应该是这样的,例如:

import os
import sys

walk_dir = sys.argv[1]

print('walk_dir = ' + walk_dir)

# If your current working directory may change during script execution, it's recommended to
# immediately convert program arguments to an absolute path. Then the variable root below will
# be an absolute path as well. Example:
# walk_dir = os.path.abspath(walk_dir)
print('walk_dir (absolute) = ' + os.path.abspath(walk_dir))

for root, subdirs, files in os.walk(walk_dir):
    print('--\nroot = ' + root)
    list_file_path = os.path.join(root, 'my-directory-list.txt')
    print('list_file_path = ' + list_file_path)

    with open(list_file_path, 'wb') as list_file:
        for subdir in subdirs:
            print('\t- subdirectory ' + subdir)

        for filename in files:
            file_path = os.path.join(root, filename)

            print('\t- file %s (full path: %s)' % (filename, file_path))

            with open(file_path, 'rb') as f:
                f_content = f.read()
                list_file.write(('The file %s contains:\n' % filename).encode('utf-8'))
                list_file.write(f_content)
                list_file.write(b'\n')

如果您不知道,文件的with语句是一个简写:

with open('filename', 'rb') as f:
    dosomething()

# is effectively the same as

f = open('filename', 'rb')
try:
    dosomething()
finally:
    f.close()
票数 420
EN

Stack Overflow用户

发布于 2017-07-19 00:26:07

如果您使用的是Python 3.5或更高版本,您可以在一行代码中完成此操作。

import glob

# root_dir needs a trailing slash (i.e. /root/dir/)
for filename in glob.iglob(root_dir + '**/*.txt', recursive=True):
     print(filename)

正如在documentation中提到的

如果recursive为true,则模式'**‘将匹配任何文件以及零个或多个目录和子目录。

import glob

for filename in glob.iglob(root_dir + '**/**', recursive=True):
     print(filename)
票数 190
EN

Stack Overflow用户

发布于 2010-02-06 17:59:59

同意Dave Webb的观点,os.walk将为树中的每个目录生成一个项目。事实是,你不需要关心subFolders

这样的代码应该可以工作:

import os
import sys

rootdir = sys.argv[1]

for folder, subs, files in os.walk(rootdir):
    with open(os.path.join(folder, 'python-outfile.txt'), 'w') as dest:
        for filename in files:
            with open(os.path.join(folder, filename), 'r') as src:
                dest.write(src.read())
票数 41
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2212643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档