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)
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)
小智 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
由于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')).