所以,我有一个有效的解决方案,但它很丑陋而且似乎不是惯用的。问题是:
对于目录树,每个目录都设置为:
.xc
档案.x
个文件,没有别的。我想,根据根路径并将树xc()
应用于.xc
fies的内容,x
将内容应用于.x
文件,然后执行与子文件夹的内容相同。
可以理解带有解释的实际代码。
谢谢!
答案 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))
这假设可以在文件名上调用x
和xc
;或者,您可以先读取内容,然后将其作为字符串传递给函数。
答案 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语法的伪代码。你应该能够知道如何做到这一点。