Python中的文件遍历

18 投票
4 回答
33524 浏览
提问于 2025-04-16 09:20

我有一个能用的解决方案,但看起来很丑,而且不太符合常规做法。问题是这样的:

对于一个目录树,每个目录都应该包含:

  • 1 个 .xc 文件
  • 至少 1 个 .x 文件
  • 可以有任意数量的子目录,格式也要一样

而且就这些,别的什么都没有。我想要的是,给定根路径后,遍历这个树,针对 .xc 文件的内容应用 xc(),针对 .x 文件的内容应用 x,然后对子文件夹的内容做同样的处理。

如果能提供实际的代码和解释,那就太好了。

谢谢!

4 个回答

1

看起来这是一个很适合用递归的地方:

import os
def process_directory(dirName):
    """Recursively process all .xc and .x files in a parent directory and its
    subdirectories"""
    dirName = os.path.abspath(dirName)
    for f in os.listdir(dirName):
        f = os.path.join(dirName, f)
        baseName, ext = os.path.splitext(f)
        if ext == '.xc':
            print "Processing [", f, "]"
            xc(f)
        elif ext == '.x':
            print "Processing [", f, "]"
            x(f)
        elif os.path.isdir(f):
            print "\nDescending into directory", f
            process_directory(dirName=os.path.join(dirName, f))
        else:
            print "Not processing", f

我希望我没有理解错你的问题。

6

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。比如说,当用户点击一个按钮时,我们希望程序能做出反应。这种情况下,我们就会用到“事件”这个概念。

事件就像是生活中的一些事情,比如你按下电灯开关,灯就亮了。编程中的事件也是类似的,当某个特定的事情发生时,程序就会执行相应的代码。

为了让程序知道什么时候发生了事件,我们需要给它设置一些“监听器”。监听器就像是一个守卫,时刻关注着某些事情的发生。一旦它发现了我们设定的事件,比如按钮被点击,它就会立刻通知程序去执行相应的操作。

这样一来,我们就可以让程序变得更加智能,能够根据用户的操作做出反应,而不是一直静静地等待。

import os

# your functions
def xc(contents): ....
def x(contents): ....

# store function references in a dict to dispatch, this is a common python idiom
funcMap = {'.xc': xc, '.x':x}

for dirpath, dirnames, filenames in os.walk(someDir):
    # use os.walk to iterate someDir's contents recursively. No
    # need to implement recursion yourself if stdlib does it for you
    for f in filenames:
        ext = os.path.splitext(f)[1]
        try:
            function = funcMap[ext]
        except KeyError:
             # no function to process files with extension 'ext', ignore it
             pass
        else:
            abspath = os.path.join(dirpath, f)
            with open(abspath) as f:
                function(f.read())
33

这个函数 os.walk 可以递归地遍历一个文件夹及其子文件夹,返回所有的文件和子文件夹的名字。

所以你只需要检查文件名中是否有 .x.xc 这两种后缀,然后在找到的时候应用你的函数(下面是未测试的代码):

import os

for dirpath, dnames, fnames in os.walk("./"):
    for f in fnames:
        if f.endswith(".x"):
            x(os.path.join(dirpath, f))
        elif f.endswith(".xc"):
            xc(os.path.join(dirpath,f))

这段代码假设你可以直接对文件名使用 xxc;另外,你也可以先读取文件的内容,然后把内容作为字符串传递给这些函数。

撰写回答