2014-02-10 4 views
-1

У меня есть текстовый файл с более чем 60 000 строк, и мне нужно пройти и найти определенное слово, а затем умножить число после него. Например:Python - Поиск и умножение целого числа после определенного слова

The cat jumped over the log 
    tree 6 
the dog also jumped over the log 
tree 43 

бы в конечном итоге, если умножение на 2, как:

The cat jumped over the log 
    tree 12 
the dog also jumped over the log 
tree 86 

Я знаю, что это довольно просто сделать, но я не могу обернуть мою голову вокруг него. Мне нужно пройти через весь текстовый файл словом, ища экземпляры «дерева», найти целое число после этого, внести изменения и затем заменить строку.

Я также знаю, что каждое появление «дерева» всегда будет иметь целое число рядом с ним.

Благодарим за помощь.

Edit:

Текущий код у меня есть на данный момент является:

file = open('export_desc.txt', 'r') 

a = "ext_mpl " 
for line in file: 
    n = file.find(a+1) 
    n = n*2 
    file.write(line.replace(a+1, a+n)) 

file.close() 
+3

Можете ли вы показать код, который вы написали до сих пор? – gravetii

+0

файл '= открыт ('export_desc.txt', 'г') а = "ext_mpl" для строки в файле: п = file.find (а + 1) п = п * 2 file.write (line.replace (a + 1, a + n)) file.close() ' – Matt

+0

Пожалуйста, добавьте его в само описание, чтобы все могли его увидеть .. – gravetii

ответ

0

Вы не должны даже написать питон скрипт, команда sed может помочь вам:

sed -r '/^tree ([0-9]+)$/{h;s/^.* ([0-9]+)$/echo \1*2|bc/e;H;g;s/[0-9]+\n//}' export_desc.txt 

Пример:

>sed -r '/^tree ([0-9]+)$/{h;s/^.* ([0-9]+)$/echo \1*2|bc/e;H;g;s/[0-9]+\n//}' 123 
The cat jumped over the log 
tree 12 
the dog also jumped over the log 
tree 86 
>cat 123 
The cat jumped over the log 
tree 6 
the dog also jumped over the log 
tree 43 
0

Используйте fileinput module перезаписать файл на месте. Вы можете использовать print, чтобы записать обратно в тот же файл (но не раздеть новую строку), или написать sys.stdout (с новой строкой осталась на месте):

import fileinput 

for line in fileinput.input('filename', inplace=True): 
    line = line.rstrip('\n') 
    if line.strip().startswith('tree '): 
     start, value = line.rsplit(None, 1) 
     line = '{} {}'.format(start, (int(value) * 2) 

    print line 

str.strip() удаляет пробельной (вкладки, пробела, возврат каретки, новые строки и т. д.) от начала и до конца строки, что позволяет увеличить допуск при тестировании tree в начале строки.

str.rsplit() method разделяет линию на последней части пробелов, предполагая, что номер является последним в строке. Аргумент None делает .rsplit() разделенным на пробелы произвольной ширины, а 1 заставляет его разделять только один раз. Это приводит к двум возвращаемым значениям; начало строки до последней части пробела и номер.

Это позволяет нам восстановить исходную линию, в основном, со значением, удвоенным.

+0

В файле ничего не меняется. Я забыл упомянуть, что перед некоторыми словами «дерево» есть отступы, которые, конечно, препятствуют работе метода startswith(). Есть ли способ сделать это, но временно игнорировать пробелы? Пробелы перед «деревом» не всегда одинаковы, поэтому включение пробелов в строку не будет работать. – Matt

+0

@nexatt: обязательно используйте 'line.strip().startswith ('tree') '. 'str.strip()' удаляет пробелы произвольной ширины из начала и конца строки. –

+0

@nexatt: следует ли сохранить ведущий отступ на выходе? –

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