读取格式独立于换行符的非常大的文件

2024-06-16 08:51:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我的Python代码支持读写由其他人创建的文件格式BLT format。BLT格式是空白和换行独立的,因为换行符和其他空白区一样被处理。这种格式的主要条目是以“0”结尾的“选票”,例如

1 2 3 0

因为格式是独立于换行符的,所以也可以写为

^{pr2}$

或者你可以在一条线上有多张选票:

1 2 3 0 4 5 6 0

这些文件可能非常大,所以我不想把整个文件读入内存。基于行的读取很复杂,因为数据不是基于行的。什么是一个好的方法来处理这些文件在一个内存高效的方式?在


Tags: 文件数据方法内存代码format格式结尾
2条回答

使用generator

>>> def ballots(f):
...     ballots = []
...     for line in f:
...             for token in line.split():
...                     if token == '0':
...                             yield ballots
...                             ballots = []
...                     else:
...                             ballots.append(token)

这将逐行读取文件,在所有空白处拆分,并将行中的标记逐个追加到列表中。每当达到0时,该选票将被yield,列表重置为空。在

对我来说,解决这个问题最直接的方法就是使用发电机。在

def tokens(filename):
    with open(filename) as infile:
        for line in infile:
            for item in line.split():
                yield int(item)

def ballots(tokens):
    ballot = []
    for t in tokens:
        if t:
            ballot.append(t)
        else:
            yield ballot
            ballot = []

t = tokens("datafile.txt")

for b in ballots(t):
    print b

我看到@katrielex在我发布我的解决方案时发布了一个生成器。我们的不同之处在于我使用了两个独立的生成器,一个用于文件中的单个标记,另一个用于您希望解析的特定数据结构。前者作为参数传递给后者,其基本思想是您可以为要解析的每个数据结构编写一个类似ballots()的函数。您可以迭代生成器生成的所有内容,也可以在任一生成器上调用next()以获得下一个令牌或选票(准备好在用完时出现StopIteration异常,或者编写生成器在实际数据用完时生成一个sentinel值,如None,并进行检查)。在

在一个类中包装整个东西是非常简单的。事实上。。。在

^{pr2}$

相关问题 更多 >