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

时间:2019-04-02 23:31:46

标签: python python-os

这是针对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中的所有文件以及其所有子文件夹中的文件。

2 个答案:

答案 0 :(得分:0)

这是我想到的最简单的方法,只需使用 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

这些结果与递归版本产生相同的结果(顺便说一句)。

答案 1 :(得分:0)

您很难解决一个简单的问题。这有效:

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)]