在Java中,你可以执行File.listFiles()
并接收目录中的所有文件。 然后,您可以轻松地通过目录树进行递归。
在Python中是否有类似的方法可以做到这一点?
是的,有。Python的方式甚至更好。
有三种可能性:
1) 喜欢 File.listFiles():
Python 有函数 os.listdir(path)。它的工作方式类似于Java方法。
2) 使用 glob 的路径名模式扩展:
模块 glob 包含使用 Unix shell 类似模式列出文件系统上的文件的功能,例如
files = glob.glob('/usr/joe/*.gif')
3) 文件遍历与步行:
非常好的是Python的os.walk功能。
walk方法返回一个生成函数,该函数以递归方式列出给定起始路径下的所有目录和文件。
举个例子:
您甚至可以即时从"dirs"中删除目录以避免走到该目录:如果dirs中的"joe":dirs.remove("joe"),以避免进入名为"joe"的目录。
import os
from os.path import join
for root, dirs, files in os.walk('/usr'):
print "Current directory", root
print "Sub directories", dirs
print "Files", files
Listdir 和 Walk 记录在这里。全球日志记录在这里。
作为一个长期的 Pythonista,我不得不说 std 库中的路径/文件操作函数低于标准:它们不是面向对象的,它们反映了一种过时的、让我们包装操作系统系统函数的哲学。 我衷心推荐"path"模块作为包装器(如果你必须知道的话,围绕os,os.path,glob和tempfile):更好,OOPy:http://pypi.python.org/pypi/path.py/2.2
这是带有路径模块的 walk():
dir = path(os.environ['HOME'])
for f in dir.walk():
if f.isfile() and f.endswith('~'):
f.remove()
在操作系统模块(文档)中尝试"listdir()":
import os
print os.listdir('.')
直接来自 Python 的引用库
>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
看看os.walk()
和这里的例子。 使用os.walk()
,您可以轻松处理整个目录树。
上面链接中的一个例子...
# Delete everything reachable from the directory named in 'top',
# assuming there are no symbolic links.
# CAUTION: This is dangerous! For example, if top == '/', it
# could delete all your disk files.
import os
for root, dirs, files in os.walk(top, topdown=False):
for name in files:
os.remove(os.path.join(root, name))
for name in dirs:
os.rmdir(os.path.join(root, name))
如果你还需要子目录,请使用os.path.walk。
步行(顶部,功能,参数) 带有回调函数的目录树遍历。 对于目录树中的每个目录,根植于 top(包括 top 本身,但不包括"."和".."),调用func(arg,dirname,fnames)。 目录名称是目录的名称,fnames 是 目录名称中的文件和子目录(不包括"."和"..")。 函数 可以就地修改 fnames 列表(例如,通过 del 或切片分配), 并且 walk 只会递归到名称保留在 fnames;这可用于实现过滤器,或施加特定的 参观顺序。 没有为 arg 定义或要求任何语义, 除此之外,arg 总是传递给 func。 它可用于,例如,通过 文件名模式或旨在累积的可变对象 统计学。 为 arg 传递 None 很常见。
我建议不要os.path.walk
,因为它在Python 3.0中被删除。 无论如何,os.walk
更简单,或者至少我觉得它更简单。
你也可以查看Unipath,一个面向对象的Python os
、os.path
和shutil
模块的包装器。
例:
>>> from unipath import Path
>>> p = Path('/Users/kermit')
>>> p.listdir()
Path(u'/Users/kermit/Applications'),
Path(u'/Users/kermit/Desktop'),
Path(u'/Users/kermit/Documents'),
Path(u'/Users/kermit/Downloads'),
...
通过奶酪店安装:
$ pip install unipath
鉴于我已经用python编程了很长时间,我多次使用os模块并制作了自己的函数来打印目录中的所有文件。
函数的代码:
import os
def PrintFiles(direc):
files = os.listdir(direc)
for x in range(len(files)):
print("File no. "+str(x+1)+": "+files[x])
PrintFiles(direc)