首页 > 解决方案 > 如何逐块读取大文件并通过块头判断?

问题描述

我有一个大文件,我想通过匹配标题逐块读取。例如,文件是这样的:

@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中做类似的事情?

标签: 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())

推荐阅读