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