Python - 添加文件名(不是完整路径)以从目录和子文件夹中列出

Python - adding file names (not full paths) to list from directory and subfolders

这是给 python 2.

我有一段代码正在创建一个包含三个相同列表的对象 (dtry)。每个列表都是带有文件夹的所有文件(不包括文件夹)。这可行,但我想将其扩展为也适用于子文件夹。

我的工作代码如下:

import os

fldr = "C:\Users\jonsnow\OneDrive\Documents\my_python\Testing\Testing"
dtry[:] = []  # clear list

for i in range(3):
        dtry.append([tup for tup in os.listdir(fldr)
                     if os.path.isfile(os.path.join(fldr, tup))])

这成功创建了三个列表,其中包含名称但不包含 fldr 中文件的完整路径(并且仅包含文件,不包含文件夹)。

我希望它也能在 fldr 的子文件夹中搜索。

不幸的是,我不知道如何让它这样做。

我拼凑了另一段代码,它也列出了子文件夹中的所有文件(等等),但它列出了完整路径,而不仅仅是文件名。如下:


import os

fldr = "C:\Users\jonsnow\OneDrive\Documents\my_python\Testing\Testing"
dtry[:] = []  # clear list

for i in range(3):
        dtry.append([os.path.join(root, name)
                     for root, dirs, files in os.walk(fldr)
                     for name in files
                     if os.path.isfile(os.path.join(root, name))])

我试过换行:

dtry.append([os.path.join(root, name)

tup for tup in os.listdir(fldr)

但这对我不起作用。

谁能告诉我这里缺少什么?

同样,我试图让 dtry 成为三个列表,每个列表都是 fldr 中的所有文件及其所有子文件夹中的文件。

这是我能想到的最简单的方法来获取所有没有任何子路径的文件名,仅使用 os.listdir():

import os
from pprint import pprint

def getAllFiles(dir, result = None):
    if result is None:
        result = []
    for entry in os.listdir(dir):
        entrypath = os.path.join(dir, entry)
        if os.path.isdir(entrypath):
            getAllFiles(entrypath ,result)
        else:
            result.append(entry)
    return result

def main():
    result = getAllFiles("/tmp/foo")
    pprint(result)

main()

这使用了我在评论中提到的递归思想。

测试目录结构:

/tmp/foo
├── D
│   ├── G
│   │   ├── h
│   │   └── i
│   ├── e
│   └── f
├── a
├── b
└── c

我得到:

['a', 'c', 'i', 'h', 'f', 'e', 'b']

如果我改变这一行:

result.append(entry)

至:

result.append(entrypath)

然后我得到:

['/tmp/foo/a',
 '/tmp/foo/c',
 '/tmp/foo/D/G/i',
 '/tmp/foo/D/G/h',
 '/tmp/foo/D/f',
 '/tmp/foo/D/e',
 '/tmp/foo/b']

要获得您想要的确切结果,您可以这样做

dtry = [getAllFiles("/tmp/foo")]
dtry.append(list(dtry[0]))
dtry.append(list(dtry[0]))

如果你想使用更紧凑的os.walk,这里有两种形式:

def getAllFiles2(dir):
    result = []
    for root, dirs, files in os.walk(dir):
        result.extend(files)
    return result

def getAllFilePaths2(dir):
    result = []
    for root, dirs, files in os.walk(dir):
        result.extend([os.path.join(root, f) for f in files])
    return result

这些产生与递归版本相同的结果(顺序除外)。

你把一个简单的问题变得非常困难。这有效:

from glob import glob

files = glob(r'C:\Users\jonsnow\OneDrive\Documents\my_python\Testing\Testing\**\*', recursive=True')
result = [files for _ in range(3)]

请注意,这会生成一个列表,其中包含对原始列表的三个引用。如果您需要三份相同的副本:

from glob import glob

files = glob(r'C:\Users\jonsnow\OneDrive\Documents\my_python\Testing\Testing\**\*', recursive=True)
result = [files.copy() for _ in range(3)]