使用Python根据数据将文件分成几个部分



我正在寻找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)
    # .... 

相关内容

  • 没有找到相关文章

最新更新