2013-01-02 13 views
1

, если у меня есть текстовый файл, как это:Читать ломаную из текстового файла

[001]This is line 1. 
[002][too long]This is line 2 but it's Tooooo 
oooo long! 
[003]This is line 3. 

Я пишу «для линии в FiLea», чтобы прочитать этот файл как:

for line in fileA: 
    ... 

сейчас необходимо объединить текущую строку и следующую строку, когда line.find («[too long]»)> = 0. Как мне это сделать?

PS: я писал:

for line in fileA: 
    if line.find("[too long]")>=0: 
     loc = fileA.tell() 
     fileB = open("file.txt") #open this file again 
     fileB.seek(loc) 
     line += fileB.readline().strip() 

, но это не сработало. Зачем?

+0

вы не можете открыть тот же файл дважды, пожалуйста, напишите сообщения об ошибке/StackTrace, что именно «техника его подводит» работу? вы не можете понять, что вы пытаетесь сделать, что мешает нашей помощи. –

+1

Итерации по линиям, поддерживая буфер. Когда строка начинается с '[...]', выведите и очистите содержимое буфера, а затем добавьте новое содержимое. Когда строка не начинается с '[...]', добавьте ее в буфер. – katrielalex

ответ

3

Звучит слишком много накладных расходов с дополнительным чтением файла. Попробуйте это:

with open('file.txt') as f: 
    for line in f: 
     if '[too long]' in line: 
      line = line.rstrip('\r\n') + next(f) 
     print line 

отпечатки

[001]This is line 1. 

[002][too long]This is line 2 but it's Tooooooooo long! 

[003]This is line 3. 

Это добавляет следующую строку, если [too long] найдена в строке. Может быть, вы хотите добавить все дальнейшие строки до начала строки с чего-то вроде [xxx]?

0

Я не уверен, как фактический файл выглядит, но я бы, вероятно, пойти с чем-то вроде this:

contents = """[001]This is line 1. 
[002][too long]This is line 2 but it's Tooooo 
oooo long! 
[003]This is line 3. 
""" 

lines = iter(contents.split("\n")) 

def fix_file(lines): 
    prev = '' 
    number = 1 
    for line in lines: 
     if not line.startswith('[{0:03d}]'.format(number)): 
      prev += line 
     else: 
      yield prev 
      number = number + 1 
      prev = line 
    yield prev 

for line in fix_file(lines): 
    print line 

Таким образом, вам не нужно дополнительное содержание в строках.

2

Вы можете использовать представление списка, чтобы получить все строки в списке, делающие что-то очень похожее на eumiros-ответ.

with open('file.txt') as f: 
    lines = [line.rstrip('\r\n') + next(f) if '[too long]' in line else line for line in f] 

Тогда выход:

>>> lines 
    ['[001]This is line 1.\n', "[002][too long]This is line 2 but it's Tooooooooo long!\n", '[003]This is line 3.\n'] 
Смежные вопросы