在 Java 中,您可以执行File.listFiles()
和接收目录中的所有文件。然后,您可以轻松地通过目录树进行递归。
在 Python 中是否有类似的方法可以做到这一点?
在 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 方法返回一个生成函数,该函数递归地列出给定起始路径下的所有目录和文件。
一个例子:
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
您甚至可以即时从“dirs”中删除目录以避免进入该目录: if "joe" in dirs: dirs.remove("joe") 以避免进入名为“joe”的目录。
作为一个长期的 Pythonista,我不得不说 std 库中的路径/文件操作函数是低于标准的:它们不是面向对象的,它们反映了一个过时的 let-wrap-OS-system-functions-without-思维哲学。我衷心推荐“路径”模块作为包装器(如果你必须知道,围绕 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()
在 os 模块 ( docs )中尝试“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。
步行(顶部,函数,arg) 带有回调函数的目录树遍历。 对于以顶部为根的目录树中的每个目录(包括顶部 本身,但不包括 '.' 和 '..'),调用 func(arg, dirname, fnames)。 dirname 是目录的名称,fnames 是目录名称的列表 dirname 中的文件和子目录(不包括“.”和“..”)。功能 可以就地修改 fnames 列表(例如,通过 del 或 slice 分配), 并且 walk 只会递归到名称保留在的子目录中 名称;这可用于实现过滤器,或施加特定的 参观顺序。没有为 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)