Как я могу прочитать две строки из файла одновременно с помощью Python - PullRequest
71 голосов
/ 01 ноября 2009

Я пишу скрипт Python, который анализирует текстовый файл. Формат этого текстового файла таков, что каждый элемент в файле использует две строки, и для удобства я хотел бы прочитать обе строки перед анализом. Можно ли это сделать на Python?

Я бы хотел что-то вроде:

f = open(filename, "r")
for line in f:
    line1 = line
    line2 = f.readline()

f.close

Но это говорит о том, что:

ValueError: Смешивание методов итерации и чтения приведет к потере данных

Связанный:

Ответы [ 14 ]

1 голос
/ 01 ноября 2009

Я работал над аналогичной проблемой в прошлом месяце. Я пробовал цикл while с помощью f.readline (), а также f.readlines (). Мой файл данных не очень большой, поэтому я, наконец, выбрал f.readlines (), который дает мне больше контроля над индексом, в противном случае Я должен использовать f.seek () для перемещения вперед и назад указатель файла.

Мой случай сложнее, чем ОП. Поскольку мой файл данных более гибок в отношении того, сколько строк нужно анализировать каждый раз, поэтому Мне нужно проверить несколько условий, прежде чем я смогу проанализировать данные.

Еще одна проблема, которую я обнаружил в f.seek (), заключается в том, что он не очень хорошо обрабатывает utf-8, когда я использую codecs.open ('', 'r', 'utf-8'), (не совсем так уверен в виновнике, в конце концов я отказался от этого подхода.)

1 голос
/ 01 ноября 2009

Моя идея состоит в том, чтобы создать генератор, который считывает две строки из файла за раз и возвращает их в виде 2-х кортежей. Это означает, что вы можете перебирать результаты.

from cStringIO import StringIO

def read_2_lines(src):   
    while True:
        line1 = src.readline()
        if not line1: break
        line2 = src.readline()
        if not line2: break
        yield (line1, line2)


data = StringIO("line1\nline2\nline3\nline4\n")
for read in read_2_lines(data):
    print read

Если у вас нечетное количество строк, оно не будет работать идеально, но это должно дать вам хорошую схему.

0 голосов
/ 29 июня 2017

Если файл имеет приемлемый размер, другой подход, использующий list-compceptionsion для считывания всего файла в список из двух кортежей , заключается в следующем:

filaname = '/path/to/file/name'

with open(filename, 'r') as f:
    list_of_2tuples = [ (line,f.readline()) for line in f ]

for (line1,line2) in list_of_2tuples: # Work with them in pairs.
    print('%s :: %s', (line1,line2))
0 голосов
/ 01 ноября 2009

Этот код Python напечатает первые две строки:

import linecache  
filename = "ooxx.txt"  
print(linecache.getline(filename,2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...