python中的文件遍历

python中的文件遍历,python,Python,所以,我有一个有效的解决方案,但它很难看,而且似乎不习惯。问题是: 对于目录树,其中每个目录都设置为具有: 1.xc文件 至少有1个.x文件 采用相同格式的任意数量的目录 没有别的了。我想,给定根路径并遍历树,将xc()应用于.xc文件的内容,x应用于.x文件的内容,然后对子文件夹的内容执行相同的操作 实际代码与解释将不胜感激 谢谢 您可以使用dict保存扩展->函数映射: funcMap = {".xc" : xc, ".x" : x} 然后创建一个递归函数,该函

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

对于目录树,其中每个目录都设置为具有:

  • 1
    .xc
    文件
  • 至少有1个
    .x
    文件
  • 采用相同格式的任意数量的目录
没有别的了。我想,给定根路径并遍历树,将
xc()
应用于
.xc
文件的内容,
x
应用于
.x
文件的内容,然后对子文件夹的内容执行相同的操作

实际代码与解释将不胜感激


谢谢

您可以使用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语法的伪代码。不过,您应该能够从中了解该怎么做。

该函数递归遍历目录树,返回所有文件和子目录名

因此,您所要做的就是从文件名中检测
.x
.xc
扩展名,并在它们出现时应用您的函数(未测试的代码如下):


这假设可以对文件名调用
x
xc
;或者,您可以先读取内容并将其作为字符串传递给函数。

似乎是使用递归的好地方:

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

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

有没有理由像s albertov那样使用
.endswith
来拆分文件?没有,事实上,
os.path
可能是更“正式”的方式(但因为我们只是检查扩展名而不是提取名称的其余部分,我认为这并不重要)。这是一个很好的解决方案,但我不会将使用os.walk()称为“非递归”!有没有理由使用
os.path.splitext(f)[1]
而不是
.endswith
?它们做的事情是不同的:vs。
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())
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())