gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:02:23 25 4
gpt4 key购买 nike

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

1 2 3 0

由于格式与换行无关,所以也可以写成

1 2
3 0

或者您可以在一行上进行多个选票:

1 2 3 0 4 5 6 0

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

最佳答案

对我来说,解决这个问题最直接的方法是使用生成器。

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

我在发布我的内容时看到@katrielalex 发布了一个使用生成器的解决方案。我们之间的区别在于我使用了两个独立的生成器,一个用于文件中的各个标记,另一个用于您希望解析的特定数据结构。前者作为参数传递给后者,基本思想是您可以为每个要解析的数据结构编写类似 ballots() 的函数。您可以遍历生成器生成的所有内容,或者在任一生成器上调用 next() 以获取下一个 token 或选票(在运行时为 StopIteration 异常做好准备out,或者编写生成器在用完真实数据时生成一个标记值,例如 None,并检查它)。

将整个内容包装在一个类中会非常简单。事实上……

class Parser(object):

def __init__(self, filename):

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

self.tokens = tokens(filename)

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

p = Parser("datafile.txt")

for b in p.ballots():
print b

关于python - 读取格式独立于换行符的非常大的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4158265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com