遍历文件夹,然后是子文件夹并打印带有文本文件路径的文件名

Posted

技术标签:

【中文标题】遍历文件夹,然后是子文件夹并打印带有文本文件路径的文件名【英文标题】:Iterate through folders, then subfolders and print filenames with path to text file 【发布时间】:2013-11-24 18:37:51 【问题描述】:

我正在尝试使用 python 创建批量运行其他软件所需的文件。 作为其中的一部分,我需要生成一个文本文件,将所需的数据文件加载到软件中。 我的问题是我需要输入此文本文件的文件存储在一组结构化文件夹中。

我需要遍历一组文件夹(最多 20 个),每个文件夹最多可以包含 3 个文件夹,其中包含我需要的文件。文件夹的底层包含软件每次运行所需的一组文件。文本文件应逐行打印这些文件的路径+名称,添加指令行,然后从文件夹移动到下一组文件,依此类推,直到检查完所有子级文件夹。

【问题讨论】:

【参考方案1】:

使用 os.walk()。以下将输出“dir”子目录中所有文件的列表。可以根据您的需要对结果进行处理:

import os                                                                                                             
                                                                                                                      
def list_files(dir):                                                                                                  
    r = []                                                                                                            
    subdirs = [x[0] for x in os.walk(dir)]                                                                            
    for subdir in subdirs:                                                                                            
        files = os.walk(subdir).next()[2]                                                                             
        if (len(files) > 0):                                                                                          
            for file in files:                                                                                        
                r.append(os.path.join(subdir, file))                                                                         
    return r                                                                                                          

对于 python 3,将 next() 更改为 __next__()

【讨论】:

【参考方案2】:

Charles 的回答很好,但可以改进以提高速度和效率。 os.walk() 产生的每个项目(参见docs)是三个项目的元组。这些项目是:

    工作目录 命名工作目录中存在的任何子目录的字符串列表 工作目录中的文件列表

知道了这一点,Charles 的大部分代码都可以通过修改 forloop 来压缩:

import os

def list_files(dir):
    r = []
    for root, dirs, files in os.walk(dir):
        for name in files:
            r.append(os.path.join(root, name))
    return r

【讨论】:

那么根目录和目录的差异是什么?我应该为目录放什么?我要遍历的所有子文件夹的父文件夹对吗?这段代码对我不起作用:(返回空数组... @alwaysaskingquestions rootos.walk() 生成的元组的第一项。 dir 是您要遍历的文件的目录。在我的答案代码中,子文件夹(由元组项dirs 表示)被忽略。仅使用文件及其根目录。 只需使用列表理解:return [os.path.join(r, n) for r, _, f in os.walk(dir) for n in f]【参考方案3】:

这将有助于列出特定的文件扩展名。在我的子文件夹中,我有很多文件,但我只对镶木地板文件感兴趣。

import os
dir = r'/home/output/'
def list_files(dir):
r = []
for root, dirs, files in os.walk(dir):
    for name in files:
        filepath = root + os.sep + name
        if filepath.endswith(".snappy.parquet"):
            r.append(os.path.join(root, name))
return r

【讨论】:

以上是关于遍历文件夹,然后是子文件夹并打印带有文本文件路径的文件名的主要内容,如果未能解决你的问题,请参考以下文章

带有 PySide2 的文件浏览器:获取文件的路径,然后终止 GUI

在 pdf 文件中查找特定文本并使用文本打印文件名和行

文本内容到集合,反之

powershell Get-Matches()获取所有正则表达式匹配。回答问题“我如何遍历文本文件并打印每个林的所有匹配的正则表达式组

在文本文件中使用逗号分隔值打印输出

使用 Qt 打印 PDF 文件