列表python中的递归子文件夹搜索和返回文件

2024-04-26 03:11:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个脚本,递归地遍历主文件夹中的子文件夹,并根据某个文件类型建立一个列表。我对剧本有意见。其当前设置如下

for root, subFolder, files in os.walk(PATH):
    for item in files:
        if item.endswith(".txt") :
            fileNamePath = str(os.path.join(root,subFolder,item))

问题是子文件夹变量正在拉入子文件夹列表,而不是项目文件所在的文件夹。我之前想为子文件夹运行一个for循环并加入路径的第一部分,但我想再检查一下Id,看看在此之前是否有人有任何建议。谢谢你的帮助!


Tags: python
3条回答

您应该使用dirpath,您称之为root。提供了dirnames,因此如果存在不希望os.walk递归到的文件夹,则可以对其进行修剪。

import os
result = [os.path.join(dp, f) for dp, dn, filenames in os.walk(PATH) for f in filenames if os.path.splitext(f)[1] == '.txt']

编辑:

在最近一次的否决之后,我突然想到glob是一个更好的扩展选择工具。

import os
from glob import glob
result = [y for x in os.walk(PATH) for y in glob(os.path.join(x[0], '*.txt'))]

也是生成器版本

from itertools import chain
result = (chain.from_iterable(glob(os.path.join(x[0], '*.txt')) for x in os.walk('.')))

用于Python 3.4+的Edit2

from pathlib import Path
result = list(Path(".").rglob("*.[tT][xX][tT]"))

我将把John La Rooy's list comprehension翻译成嵌套for,以防其他人无法理解它。

result = [y for x in os.walk(PATH) for y in glob(os.path.join(x[0], '*.txt'))]

应等同于:

import glob

result = []

for x in os.walk(PATH):
    for y in glob.glob(os.path.join(x[0], '*.txt')):
        result.append(y)

这是list comprehension和函数os.walkglob.glob的文档。

Changed in Python 3.5: Support for recursive globs using “**”.

glob.glob()得到了一个新的recursive parameter

如果要获取my_path下的每个.txt文件(递归地包括子目录):

import glob

files = glob.glob(my_path + '/**/*.txt', recursive=True)

# my_path/     the dir
# **/       every file and dir under my_path
# *.txt     every file that ends with '.txt'

如果需要迭代器,可以使用iglob作为替代:

for file in glob.iglob(my_path, recursive=False):
    # ...

相关问题 更多 >