Python中的文件遍历
我有一个能用的解决方案,但看起来很丑,而且不太符合常规做法。问题是这样的:
对于一个目录树,每个目录都应该包含:
- 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))
这段代码假设你可以直接对文件名使用 x
和 xc
;另外,你也可以先读取文件的内容,然后把内容作为字符串传递给这些函数。