使用Python按数据分割文件成多个部分

1 投票
1 回答
546 浏览
提问于 2025-04-17 23:29

我想找一个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)
    # .... 

撰写回答