走一个目录树的Python方法是什么?

Mik*_*ike 22 python directory-walk

我觉得分配文件和文件夹以及执行+ = [item]部分有点hackish.有什么建议?我正在使用Python 3.2

from os import *
from os.path import *

def dir_contents(path):
    contents = listdir(path)
    files = []
    folders = []
    for i, item in enumerate(contents):
        if isfile(contents[i]):
            files += [item]
        elif isdir(contents[i]):
            folders += [item]
    return files, folders
Run Code Online (Sandbox Code Playgroud)

San*_*rma 31

查看os.walk返回路径的函数及其包含的目录和文件.这应该会大大缩短您的解决方案.

  • 但是 `os.walk` 并不像 OP 的代码那样仅限于一个目录级别。 (2认同)

mon*_*kut 18

os.walk并且os.scandir是很好的选择,但是,我越来越多地使用pathlib,并且使用 pathlib 您可以使用该.glob()方法:

root_directory = Path(".")
for path_object in root_directory.glob('**/*'):
    if path_object.is_file():
        print(f"hi, I'm a file: {path_object}")
    elif path_object.is_dir():
        print(f"hi, I'm a dir: {path_object}")


Run Code Online (Sandbox Code Playgroud)

  • 但是,os.walk 已经为您分隔了文件和目录。另外,只需记住:使用 os.walk,如果我将 topdown 设置为 True(默认),我可以操作子目录列表,例如,跳过整个子树。请参阅文档中有关大型树中 ** 的注释。我希望 os.walk 可以返回 Path 对象。(愚蠢的5分钟编辑限制) (6认同)

小智 11

对于使用pathlib( python >= 3.4)寻找解决方案的任何人

from pathlib import Path

def walk(path): 
    for p in Path(path).iterdir(): 
        if p.is_dir(): 
            yield from walk(p)
            continue
        yield p.resolve()

# recursively traverse all files from current directory
for p in walk(Path('.')): 
    print(p)

# the function returns a generator so if you need a list you need to build one
all_files = list(walk(Path('.'))) 
Run Code Online (Sandbox Code Playgroud)

但是,如上所述,这不会保留由 os.walk

  • 我想我以前从未见过“yield from”语法,或者至少我忘记了它。感谢您在这里说明它!后代相关文档:https://docs.python.org/3/whatsnew/3.3.html#pep-380 (5认同)

Mat*_*teo 9

由于Python >= 3.4存在生成器方法Path.rglob。因此,要处理下的所有路径,some/starting/path只需执行以下操作

from pathlib import Path

path = Path('some/starting/path') 
for subpath in path.rglob('*'):
    # do something with subpath
Run Code Online (Sandbox Code Playgroud)

要获取列表中的所有子路径,请执行以下操作list(path.rglob('*'))。要仅获取带有扩展名的文件sql,请执行 list(path.rglob('*.sql')).