文件走在python中

时间:2011-01-03 06:46:58

标签: python

所以,我有一个有效的解决方案,但它很丑陋而且似乎不是惯用的。问题是:

对于目录树,每个目录都设置为:

  • 1 .xc档案
  • 至少1 .x个文件
  • 任意数量的目录采用相同的格式

,没有别的。我想,根据根路径并将树xc()应用于.xc fies的内容,x将内容应用于.x文件,然后执行与子文件夹的内容相同。

可以理解带有解释的实际代码。

谢谢!

4 个答案:

答案 0 :(得分:20)

函数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;或者,您可以先读取内容,然后将其作为字符串传递给函数。

答案 1 :(得分: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())

答案 2 :(得分: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

我希望我没有错过你的问题。

答案 3 :(得分:-2)

你可以使用dict来保存扩展名 - >功能映射:

funcMap = {".xc" : xc,
           ".x"  : x}

然后创建一个递归函数,它接受一个目录,获取该目录中的文件列表,并确定每个文件的扩展名:

def iterateDir(s):

    l = dir.list(s) # Not a real function!

    for entry in l:
        ext = entry.extension() # Not a real function!

现在,在这个for循环中,您需要确定该条目是文件还是目录,并执行正确的操作:

        if isdir(entry):
            iterateDir(entry)
        elif ext in funcMap.keys():
            funcMap[ext]()

这应该适用于您想要做的事情。

免责声明 - 不能保证所有这些都是有效的Python。它主要是带有类似Python语法的伪代码。你应该能够知道如何做到这一点。