我正在寻找awk脚本的Python等量物,以根据记录中的标志将文件拆分为26个部分。这是因为一个文件中有26种不同的记录类型,这是Burrouli在20世纪70年代使用的分层数据库遗留下来的。我希望能够打开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")但是我不知道如何使用非硬编码的句柄打开文件。
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)
# ....