2015-04-05 4 views
0

У меня есть текстовый файл, который я хочу проанализировать. Я пытаюсь найти каждую строку, содержащую определенные символы (например: «@»), а затем распечатать линию, расположенную по 3 строки перед ней (например: если строка 5 содержит «@», я хотел бы напечатать строку 2) это то, что я до сих пор:Печать конкретных строк txt файл python

file = open('new_file.txt', 'r')  
a = list() 
x = 0 
for line in file: 
    x = x + 1 
    if '@' in line: 
     a.append(x) 
     continue 
    x = 0 
for index, item in enumerate(a): 
     for line in file: 
      x = x + 1 
      d = a[index] 
      if x == d - 3: 
       print line 
       continue 

он не будет работать (он ничего не печатает, когда я кормить его файл, содержащий строки, содержащие «@»), любые идеи?

+0

Ваша программа не является синтаксически правильной (проблемы в намерении). Не могли бы вы исправить это, пожалуйста. Затем, пожалуйста, укажите «не будет работать». (И, конечно, вы должны избавиться от «вложенного» чтения того же файлового дескриптора ...) – flaschbier

+1

@flaschbier done –

ответ

-1

Для файла IO он обычно наиболее эффективен для времени программиста и времени выполнения, чтобы использовать reg-ex для соответствия шаблонам. В сочетании с итерацией по строкам в файле. ваша проблема действительно не проблема.

import re 
file = open('new_file.txt', 'r') 
document = file.read() 
lines = document.split("\n") 
LinesOfInterest = [] 
for lineNumber,line in enumerate(lines): 
    WhereItsAt = re.search(r'@', line) 
    if(lineNumber>2 and WhereItsAt): 
     LinesOfInterest.append(lineNumber-3) 
print LinesOfInterest 
for lineNumber in LinesOfInterest: 
    print(lines[lineNumber]) 

Линии Interest теперь список номеров строк, соответствующих указанным критериям

Я использовал

line1,0 
line2,0 
line3,0 
@ 
line1,1 
line2,1 
line3,1 
@ 
line1,2 
line2,2 
line3,2 
@ 
line1,3 
line2,3 
line3,3 
@ 

в качестве входных данных с получением

[0, 4, 8, 12] 
line1,0 
line1,1 
line1,2 
line1,3 
+0

потрясающий! что если бы я должен был соответствовать больше, чем «@», например, строка должна содержать любые (не обязательно все) следующие («mail», «@», «user») –

+0

WhereItsAt = re.search (r '@ | mail | user ', line) – kpie

0

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

Во-вторых, ваша логика индексирования немного запутана. Предполагая, что ваши файлы не огромны относительно вашего размера памяти, гораздо проще просто прочитать все в памяти (как список) и манипулировать им там.

myfile = open('new_file.txt', 'r')  
a = myfile.readlines(); 
for index, item in enumerate(a): 
    if '@' in item and index - 3 >= 0: 
     print a[index - 3].strip() 

Это было проверено на следующем входе:

PrintMe 
PrintMe As Well 
Foo 
@Foo 
[email protected] 
hello world will print 
null 
null 
@@ 
-1

Итак, проблема в том, что вы уже итерация полностью через файловый дескриптор file в строке 4 при попытке снова в строке 11. Итак, строка 11 сделает пустой цикл. Может быть, это было бы лучше идея итерации файла только один раз и вспомнить последние несколько строк ...

file = open('new_file.txt', 'r') 
a = ["","",""] 
for line in file: 
    if "@" in line: 
     print(a[0], end="") 
    a.append(line) 
    a = a[1:] 
-1

Вы могли бы использовать что-то вроде этого.

class RingBuffer(object): 
    def __init__(self, size): 
     self.list = [None for i in xrange(size)] 

    def append(self, x): 
     self.list.pop(0) 
     self.list.append(x) 

buf = RingBuffer(4) 
lines = [ 
    '111', 
    '@222', 
    '333', 
    '444', 
    '@555', 
    '@666', 
    '777', 
    '888' 
    ] 

for l in lines: 
    buf.append(l) 
    if ('@' in l): 
     print ("{0}".format(buf.list[0])) 
+0

Зачем голосовать? – Tom

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