我正在尝试使用 python 创建批量运行其他软件所需的文件。作为其中的一部分,我需要生成一个文本文件,将所需的数据文件加载到软件中。我的问题是我需要输入此文本文件的文件存储在一组结构化文件夹中。
我需要遍历一组文件夹(最多 20 个),每个文件夹最多可以包含 3 个文件夹,其中包含我需要的文件。文件夹的底层包含软件每次运行所需的一组文件。文本文件应逐行打印这些文件的路径+名称,添加指令行,然后从文件夹移动到下一组文件,依此类推,直到检查完所有子级文件夹。
我正在尝试使用 python 创建批量运行其他软件所需的文件。作为其中的一部分,我需要生成一个文本文件,将所需的数据文件加载到软件中。我的问题是我需要输入此文本文件的文件存储在一组结构化文件夹中。
我需要遍历一组文件夹(最多 20 个),每个文件夹最多可以包含 3 个文件夹,其中包含我需要的文件。文件夹的底层包含软件每次运行所需的一组文件。文本文件应逐行打印这些文件的路径+名称,添加指令行,然后从文件夹移动到下一组文件,依此类推,直到检查完所有子级文件夹。
查尔斯的回答很好,但可以改进以提高速度和效率。os.walk() 产生的每个项目(参见文档)是三个项目的元组。这些项目是:
知道了这一点,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
使用 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__()
.
这将有助于列出特定的文件扩展名。在我的子文件夹中,我有很多文件,但我只对镶木地板文件感兴趣。
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