чтение строк 2 одновременно - PullRequest
12 голосов
/ 07 октября 2009

Есть ли лучший способ прочитать две строки за раз из файла в python, чем:

with open(fn) as f:
    for line in f:
        try:
            line2 = f.next()
        except StopIteration:
            line2 = ''
        print line, line2 # or something more interesting

Я в 2.5.4. Что-нибудь другое в новых версиях?

РЕДАКТИРОВАТЬ: отмеченный удаленный ответ: в py3k вам нужно будет сделать следующее (f) вместо f.next () Не говоря уже о смене печати

Ответы [ 3 ]

17 голосов
/ 07 октября 2009
import itertools

with open(fn) as f:
  for line, line2 in itertools.izip_longest(f, f, fillvalue=''):
    print line, line2

Увы, izip_longest требует Python 2.6 или выше; 2.5 имеет только izip, что усечет последнюю строку, если f имеет нечетное количество строк. Конечно, довольно просто предоставить эквивалентную функциональность в качестве генератора.

Вот более общий итератор-оболочка «N за один раз»:

def natatime(itr, fillvalue=None, n=2):
  return itertools.izip_longest(*(iter(itr),)*n, fillvalue=fillvalue)

itertools, как правило, лучший путь, но, если вы настаивали на его реализации самостоятельно, то:

def natatime_no_itertools(itr, fillvalue=None, n=2):
  x = iter(itr)
  for item in x:
    yield (item,) + tuple(next(x, fillvalue) for _ in xrange(n-1))

В 2.5, я думаю, что лучший подход на самом деле не генератор, а другое решение на основе itertools:

def natatime_25(itr, fillvalue=None, n=2):
  x = itertools.chain(iter(itr), (fillvalue,) * (n-1))
  return itertools.izip(*(x,)*n)

(поскольку 2.5 не имеет встроенного next, а также отсутствует izip_longest).

2 голосов
/ 07 октября 2009

Вы могли бы сделать это более понятным с помощью генератора:

def read2(f):
    for line in f:
        try:
            line2 = f.next()
        except StopIteration:
            line2 = ''

        yield line, line2

with open(fn) as f:
    for line1, line2 in read2(f):
        print line1
        print line2
1 голос
/ 07 октября 2009

для файлов малого и среднего размера,

>>> data=open("file").readlines()
>>> for num,line in enumerate(data[::2]):
...  print ''.join(data[num:num+2])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...