在 Python 中寻找类似于 Java 的文件遍历函数



在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"中删除目录以避免走到该目录:如果dirs中的"joe":dirs.remove("joe"),以避免进入名为"joe"的目录。

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 osos.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

鉴于我已经用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)

相关内容

  • 没有找到相关文章

最新更新