2014-10-25 19 views
-1

Я пишу код, который ищет в текстовом файле значение и печатает предыдущую строку; , но я столкнулся с двумя проблемами. Сначала я не нашел способ распечатать предыдущую строку, и когда я написал код для печати следующего значения, я получил ошибку.python ТипError: str объект не является итератором

Код: -

with open('Perfix/prefix.txt') as f: 
    lines = f.readlines() 
    for line in lines: 
     if "100" in line: 
      print (next(line)) 

Предполагаемый сценарий: -

Код должен искать в prefix.txt файле найти строку со значением 100 в точности то она должна напечатать предыдущую строку. Это оно !!

Ошибка: -

Traceback (most recent call last): 
    File "1.py", line 7, in <module> 
    print next(line) 
TypeError: str object is not an iterator 

Что такое ошибка? Также не могли бы вы посоветовать, как печатать «предыдущую», а не следующую строку?

Пример: -

Файл prefix.txt

00 
122 
141 
1525 
1162 
1547 
100 
125 
15321 
1100 
1513 
142100 

Выход: -

1547 
+0

Что вы ожидали вместо этого? Почему вы использовали 'next()' здесь вообще? –

+1

отслеживать предыдущую строку и просто распечатывать ее, если 100 находится в строке –

ответ

3

Самый простой способ найти предыдущую строку, чтобы просто хранить линии каждый раз, когда он не сделал матч:

with open('Perfix/prefix.txt') as f: 
    previous = None 
    for line in f: 
     line = line.strip() 
     if line == '100': 
      print previous 
     previous = line 

Обратите внимание, что вам не нужно сначала считывать все строки в памяти; просто перейдем к файловому объекту.

Функция next() не является чем-то, что вы должны использовать здесь вообще; он требует итератора и будет продвигать его до следующего пункта, а не перематывать его назад к предыдущей записи.

1

Сообщение об ошибке ясна - line является str ИНГ, а не итератора, так next(line) без разницы. Рассмотрим:

next('hello') 

Что должно произойти?


Чтобы справиться с вашей проблемой, я хотел бы предложить что-то вроде:

for index, line in enumerate(lines): # get the index for each line as we go 
    if index and line.strip() == '100': # if this isn't the first line & is just '100' 
     print lines[index-1] # print the previous line 
     break # optional - stop iterating if you don't want to find further lines 

или перебирать линий в парах; см., например, Iterate a list as pair (current, next) in Python.

Заметим также, что вы можете сделать это после файл закрыт:

with open(...) as f: 
    lines = f.readlines() 
for index, line in enumerate(lines): 
    ... 
+0

thx bro ваш код работает, но когда я использовал его, когда в файле есть строка типа «015100», она также включается, мне просто нужен ПЕРВЫЙ ТОЧКА MATCH ... –

+0

Что значит «точное совпадение» *? Почему вы используете 'in'? Вы имеете в виду 'line == '100 \ n''? – jonrsharpe

+1

@MohammedAldaoudi: вам нужно сообщить нам * в своем вопросе *, что вы пытаетесь сделать, а не просто спрашивать об ошибке, которую вы не понимаете. –

1

Через re модуль.

#!/usr/bin/python 
import re 
with open('file', 'r') as f: 
    lines = f.read() 
    print re.findall(r'(?m)^(.*)\n100$', lines)[0] 

Выход:

1547 

Объяснение:

(?m)      set flags for this block (with^and $ 
         matching start and end of line) (case- 
         sensitive) (with . not matching \n) 
         (matching whitespace and # normally) 
^      the beginning of a "line" 
(      group and capture to \1: 
    .*      any character except \n (0 or more 
          times) 
)      end of \1 
\n      '\n' (newline) 
100      '100' 
$      before an optional \n, and the end of a 
         "line" 
+2

Регулярное выражение здесь избыточно, и потребовалось бы считывать весь файл в память. Вы не можете сделать это, если файл достаточно велик. –

+0

Да, я согласен с тобой .. –

Смежные вопросы