使用Python按数据分割文件成多个部分
我想找一个Python的写法,能把一个文件根据记录中的标志分成26个部分。这个文件里有26种不同的记录类型,这种设计是因为在1970年代,Burroughs使用的分层数据库的遗留问题。我原本希望能打开26个文件,名字从f_A到f_Z,而不是传统的f1,然后在读取记录时直接输出,而不是把所有内容都放在一个缓存里。
# Gawk original - split new valuation roll format into record types A-Z
# run gawk -F\| -f split.awk input_file
# creates A.raw, B.raw, .... Z.raw
# Oct 1995
{ident = $8;
file = ident".raw";
print $0 >> file}
所以我想我可以创建一个文件句柄,然后用eval()之类的方式来把每条记录导向正确的输出文件。
for line in fileinput.input(src):
parts = line.split('|')
recType = parts[7]
recFile = 'f_'+recType
if not recType in openFiles:
eval(recFile) = open(recType+".raw",'w') # how should this line be written?
eval(recFile).write(line)
# ....
我可以通过f1.name获取系统文件的名字,并用eval("f_A")来评估一个变量以获取句柄,但我不知道怎么用一个不是硬编码的句柄来打开文件。
1 个回答
0
eval
是一种应该尽量避免使用的东西,幸运的是,它几乎在任何情况下都不需要用到。在这个例子中,open(recType+".raw",'w')
是用来创建一个文件句柄的。你只需要把它和 recType
关联起来。这就是字典的用处。
在下面的代码中,openFiles
是一个字典。每当我们遇到一个新的 recType
时,我们就为它打开一个文件,并把这个文件的句柄保存在 openFiles
中,键是 recType
。每当我们想再次写入这个文件时,只需从字典中请求这个文件的句柄。这样:
openFiles = {}
for line in fileinput.input(src):
parts = line.split('|')
recType = parts[7]
if not recType in openFiles:
openFiles[recType] = open('f_' + recType, 'w')
openFiles[recType].write(line)
# ....