10

在 Java 中,您可以执行File.listFiles()和接收目录中的所有文件。然后,您可以轻松地通过目录树进行递归。

在 Python 中是否有类似的方法可以做到这一点?

4

9 回答 9

25

就在这里。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”的目录。

listdir 和 walk 记录在这里。glob 记录在这里

于 2008-09-26T17:30:39.347 回答
5

作为一个长期的 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()
于 2008-09-27T08:27:39.207 回答
3

在 os 模块 ( docs )中尝试“listdir()” :

import os
print os.listdir('.')
于 2008-09-26T17:26:17.377 回答
2

直接来自 Python 的参考库

>>> import glob
>>> glob.glob('./[0-9].*')
['./1.gif', './2.txt']
>>> glob.glob('*.gif')
['1.gif', 'card.gif']
>>> glob.glob('?.gif')
['1.gif']
于 2008-09-26T17:24:10.750 回答
2

看看这里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))
于 2008-09-26T17:27:59.103 回答
2

如果您还想要子目录,请使用 os.path.walk。

步行(顶部,函数,arg)

        带有回调函数的目录树遍历。

        对于以顶部为根的目录树中的每个目录(包括顶部
        本身,但不包括 '.' 和 '..'),调用 func(arg, dirname, fnames)。
        dirname 是目录的名称,fnames 是目录名称的列表
        dirname 中的文件和子目录(不包括“.”和“..”)。功能
        可以就地修改 fnames 列表(例如,通过 del 或 slice 分配),
        并且 walk 只会递归到名称保留在的子目录中
        名称;这可用于实现过滤器,或施加特定的
        参观顺序。没有为 arg 定义或要求任何语义,
        超出该参数始终传递给 func。它可以用于,例如,通过
        文件名模式,或旨在累积的可变对象
        统计数据。为 arg 传递 None 是很常见的。
于 2008-09-26T17:31:07.927 回答
2

我不建议这样做,os.path.walk因为它已在 Python 3.0 中被删除。 os.walk无论如何,它更简单,或者至少觉得它更简单。

于 2008-09-26T18:58:52.973 回答
1

您还可以查看Unipath ,它是 Python 和os模块的面向对象的包装器。os.pathshutil

例子:

>>> 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
于 2013-08-27T12:50:45.150 回答
0

看到我在 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)
于 2016-02-29T17:26:59.153 回答