对我来说,解决这个问题最直接的方法就是使用发电机。
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()
以获取下一个标记或选票(当您用完时为StopIteration
例外做准备,或者写入发生器以生成标记值,例如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
你对BLT格式或扩展(Open STV)格式感兴趣吗?是你给每种格式的唯一规范的链接? – 2010-11-11 20:01:14
完全披露,我写了链接维基页面并设计了扩展格式。我对原始格式非常感兴趣,因为它是独立于新行的格式(由于我鼓励人们使用换行符,因此未在wiki页面中进行说明)。 – 2010-11-11 20:30:17