Для меня самый простой способ решить эту проблему - с помощью генераторов.
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