2016-02-14 4 views
0

Я попытался найти это, но в итоге я нашел код, который заменяет одно конкретное слово. Я использую этот код:Как найти термин в текстовом файле, а затем заменить всю строку новой строкой в ​​python?

phrase = open(club, 'a') 
    for line in phrase: 
     if line.contains(name): 
      #what do i put here? 
     else: 
      pass 
else: 
    pass 

так что позволяет сказать, у меня есть текстовый файл, который содержит sam 10, и я хочу, чтобы заменить это sam 5. Если бы я сделал это с приведенным выше кодом, как бы я? Имя останется таким же, но номер не будет. Поскольку число отличается от каждого имени, я не смогу найти номер, поэтому я ищу имя. Я думал об использовании line.replace, но это меняет только одну фразу, тогда как я хочу, чтобы вся строка изменилась.

Редактировать: Это будет сделано в предположении, что текстовый файл имеет несколько имен разных людей с разными номерами. Я бы хотел, чтобы он искал это конкретное имя и заменил всю строку.

Спасибо!

+0

Можете ли вы предоставить примерную строку и результаты, которые вы ожидаете? – Obsidian

+0

Не могли бы вы высказать свой полный код? Это не компилируется для меня. –

ответ

0

Вы можете проверить построчно, чтобы изменять и модифицировать исходный, чтобы сохранить изменения: «меняется только одна фраза, в то время как я хотел бы, чтобы вся линия, чтобы изменить»

f = open('sample.txt', 'r') 
lines = f.readlines() 
f.close() 
name = 'ali' 

for i in range(len(lines) - 1): 
    line = lines[i] 
    #Find 'name' index (-1 if not found) 
    index = line.find(name) 
    # If the wanted name is found 
    if index != -1: 
     #Split line by spaces to get name and number starting from name 

     words = line[index:].split() 
     # Name and number should be the first two elements in words list 
     name_number = words[0]+ ' ' + '5' #words[1] 

     # 
     # Do some thing with name_number 
     # 

     # the last '1' is to skip copying a space 
     line = line[:index] + name_number + ' ' + line[index + len(name_number) + 1:] 

     # Save result 
     lines[i] = line 

output = open('sample.txt', 'w') 
for line in lines: 
    output.write(line) 
output.close() 
+0

Проверьте это.и надеюсь, что это будет полезно. – Zety

+0

Я предполагаю, что sample.txt - это файл со всеми моими именами и номерами в них? Я заменил индекс другой переменной, поскольку индекс ранее не использовался. Когда вы размещаете это в моем коде, он ничего не сделал, поскольку новый номер с тем же именем был добавлен. Не могли бы вы объяснить, что вы имели в виду при первых двух элементах в списке слов? Я извиняюсь за то, как неопытный я с тех пор, как недавно начал питон. –

+0

например 'line = некоторый текст sam 10 text',' line.find ('sam') 'будет возвращать' 10' и 'строка [index:]. Split()' sould be '' sam 10 text'.split() ', который дает' ['sam', '10', 'text'] '. Если это не ясно, я отредактирую сообщение. – Zety

0

В общем, есть много способов, один из них будет:

Использование встроенного метода:

with open(club, 'r') as in_file, open('new_file', 'w') as out_file: 
    for line in in_file: 
     if name in line: 
      out_file.write(new_line) 
     else: 
      out_file.write(line) 

Но это имеет эффект создания нового файла.

EDIT:

Если вы хотите сделать INPLACE замены, то вы можете использовать fileinput модуль, таким образом:

for line in fileinput.input(club, inplace=True): 
    if name in line: 
     line = 'NEW LINE' #Construct your new line here 
     print(line) #This will print it into the file 
    else: 
     print(line) #No Changes to be made, print line into the file as it is 

Цитируя docs:

class fileinput.FileInput(files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None)
...
Дополнительно Inplace фильтрация: если ключевое слово аргумент Inplace = True передается fileinput.input() или конструктору FileInput, файл будет перемещен в файл резервного копирования и стандартный вывод направляется во входной файл (если файл с тем же именем как файл резервной копии уже существует, он будет заменен молча). Это позволяет написать фильтр, который переписывает его входной файл на место.

+0

Будет ли способ сделать это, поэтому он просто редактирует исходный файл и не создает отдельный файл? Спасибо –

+0

@alhal .. Да, может быть ... Проверьте мое редактирование –

+0

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

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