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)]
这是给 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)]