python - 如何逐块读取大文件并通过块头判断?
问题描述
我有一个大文件,我想通过匹配标题逐块读取。例如,文件是这样的:
@header1
a b c 1 2 3
c d e 2 3 4
q w e 3 4 5
@header2
e 89 78 56
s 68 77 26
...
我写了一个这样的脚本:
with open("filename") as f:
line=f.readline()
if line.split()[0]=="@header1":
list1.append(f.readline().split()[0])
list2.append(f.readline().split()[1])
...
elif line.split()[0]=="@header2":
list6.append(f.readline().split()[0])
list7.append(f.readline().split()[1])
...
但它似乎只读取了第一个标题而没有读入第二个块。此外,这些块之间还有一些空行。当行匹配某些字符串并跳过那些空行时如何读取块。
我知道在 C 中,它会是 switch。如何在python中做类似的事情?
解决方案
IMO,您的误解是关于如何读取 csv 文件。至少我怀疑从 C 中“切换”在这里的帮助比使用 if 子句所能做的更多。
但是,请理解,您必须逐行遍历文件。也就是说,如果您以前不知道长度,则没有什么可以处理整个块。
所以你的算法是这样的:
对于文件中的每一行:
. .是标题?
. . .然后准备这个特定的标题
。.是空行吗?
. . .然后跳过
。.是数据吗?
. . .然后根据上面的准备追加
在代码中,这可能是
block_ctr = -1
block_data = []
with open(filename) as f:
for line in f:
if line: # test if line is not empty
if line.startswith('@header'):
block_ctr += 1
block_data.append([])
else:
block_data[block_ctr].append(line.split())