2015-10-13 4 views
0

Моя проблема заключается в замене строк в текстовом файле другой строкой. Эти ключевые строки находятся в списке, называемом word_list. Я пробовал следующее: ничего не работает. Он печатает фразу в document.text, как представляется, без замены:Python заменить строку в текстовом файле со значением из списка

word_list = {'hi' : 'test', 'how' : 'teddy'} 

    with open("document.txt") as main: 
     words = main.read().split() 

    replaced = [] 
    for y in words: 
     replacement = word_list.get(y, y) 
     replaced.append(replacement) 
    text = ' '.join(word_list.get(y, y) for y in words) 


    print text 

    new_main = open("done.txt", 'w') 
    new_main.write(text) 
    new_main.close() 

Содержание Document.txt:

hi you, how is he? 

Выходной ток такой же, как Document.txt, когда оно должно быть :

test you, teddy is he? 

Любые решения/помощь была бы оценена :)

+1

почему вы хотите, чтобы пройти через все это, когда вы можете использовать 'replace' метод – The6thSense

+0

'word_list', несмотря на его название, словарь ... Кроме того, вы полностью игнорируете' replace', когда вы создаете 'text' в конце, предпочитая вместо этого использовать выражение генератора. – jonrsharpe

+0

и ваш код работает для меня? – The6thSense

ответ

0
word_list = {'hi' : 'test', 'how' : 'teddy'} 

with open("document.txt") as main: 
    with open('done.txt', 'w') as new_main: 
     input_data = main.read() 
     for key, value in word_list.iteritems(): 
      input_data = input_data.replace(key, value) 

     new_main.write(input_data) 

Это прочитает все содержимое файла (не самое эффективное, если это большой файл), затем перебирает ваш поиск и заменяет элементы в вашем словаре и вызывает замену текста ввода. После этого он будет записывать данные в ваш новый файл.

Некоторые вещи, чтобы помнить при таком подходе

  • если ваш входной файл большой, он будет медленным
  • вы ищете шаблон может также соответствовать фрагменты слов, то есть. hi будет смотреть which, поэтому вы также должны это исправить.
+0

'.replace()' не будет работать аккуратно для замены слов. – grc

+0

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

+0

@ChristianWitts ваше решение работает, спасибо :) однако, если бы я хотел избежать замены фрагментов слов других строк, как это сделать? – user47467

1

Как вы, кажется, хотят, чтобы заменить слова, то это будет использовать более естественное определение «слова»:

import re 
word_list = {'hi' : 'test', 'how' : 'teddy'} 
with open('document.txt') as main, open('done.txt', 'w') as done: 
    text = main.read() 
    done.write(re.sub(r'\b\w+\b', lambda x: word_list.get(x.group(), x.group()), text)) 
+0

Лучше использовать 'r" \ b ("+" | ".join (word_list) + r") \ b ",' как шаблон, так что вы без необходимости заменяете слово _every_. Кроме того, '\ w' не будет работать, если эти слова содержат необычные символы. –

+0

@tobias_k, проверяя каждое слово для вариантов N, является O (N), в то время как ненужная замена - это O (1) (хотя, вероятно, более длительная операция). Там, где лежит баланс, это вопрос профилирования. И \ w по определению является символом слова. –

+0

Если у вас есть N альтернатив, каждый из них должен быть проверен до тех пор, пока не будет найден правильный, нет ничего, что мог бы сделать двигатель regexp. –

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