2015-02-19 3 views
0

У меня есть большой текстовый файл, в котором есть слова, которые я хочу заменить. Я помещаю эти слова в csv-файл, потому что я постоянно добавляю и меняю слова и не хочу помещать слова в скрипт python. На каждой строке есть слово, которое я хочу заменить, за которым следует слово, которое я хочу заменить. Как это:python: заменить слова в файле словами из другого файла

A_old,A_new 
another word,another new word 
something old,something new 
hello,bye 

Я знаю, как заменить отдельные слова в файлах с питоном со строкой функции замены, но я не знаю, как это сделать, когда слова перечислены в другом файле. Я старался изо всех сил, но я не могу окунуться в то, как работать со словарями/списками/кортежами. Я довольно новичок в python, и до сих пор мне удалось найти примеры из Интернета, но это выходит за рамки моих возможностей. У меня есть всевозможные ошибки, такие как «unhashable type: list» и «ожидаемый объект буфера символов». Последнее, что я пробовал, было самым успешным в том, что у меня не было никаких ошибок, но потом ничего не произошло. Это код. Я уверен, что это уродливо, но я надеюсь, что это не совсем безнадежно.

reader = csv.reader(open('words.csv', 'r')) 
d = {} 
for row in reader: 
    key, value = row 
    d[key] = value 

newwords = str(d.keys()) 
oldwords = str(d.values()) 

with open('new.txt', 'wt') as outfile: 
    with open('old.txt', 'rt') as infile: 
     for line in infile: 
      outfile.write(line.replace(oldwords,newwords)) 

Причина Я делаю это потому, что я работаю на поваренной с индексом ингредиента на основе, и я не хочу, индекс как с «кнута» и «морковь», вместо этого я хочу замените «морковь» на «морковь» и т. д. для всех остальных ингредиентов. Спасибо, кучка для подталкивания в правильном направлении!

+0

С одной стороны, вам нужно использовать 'd [key] = [значение]', чтобы создать список списков, а не 'd [key] = value'. –

+0

Но непонятно, почему у вас есть список списков вообще; здесь не правильная модель данных. Простой текст струн будет делать. –

+0

Регулярный 'replace' может не подойти для этой задачи. Предположим, вы все разобрали материал dict, и вы, наконец, замените все экземпляры «моркови» в вашем файле «морковкой». Но это также заменит все существующие случаи «моркови» на «морковь». 'replace' не только ищет полные слова для замены; он с радостью заменит части слов. – Kevin

ответ

2

Сначала вы делаете список пар (old_word, new_word) из «» word.csv :

old_new = [i.strip().split(',') for i in open('words.csv')] 

Затем, вы можете заменить построчно:

with open('new.txt', 'w') as outfile, open('old.txt') as infile: 
    for line in infile: 
     for oldword, newword in old_new: 
      line = line.replace(oldword, newword) 
     outfile.write(line) 

или весь файл сразу:

with open('new.txt', 'w') as outfile, open('old.txt') as infile: 
    txt = infile.read() 
    for oldword, newword in old_new: 
     txt = txt.replace(oldword, newword)  
    outfile.write(txt) 

но вы должны заменить одно слово на время.

+0

Это похоже на шарм! Как по очереди, так и по всему файлу. Однако у вас недостаточно репутации, чтобы проголосовать за свой ответ. Я так рад. Очень признателен. –

0

В вашем примере кода вы читаете пар слов замены в словаре, а затем в два списка с ключами и значениями. Я не знаю, почему.

Я предлагаю прочитать заменяющие слова в списке кортежей.

with open('words.csv', 'rb') as rep_words: 
    rep_list = [] 
    for rep_line in rep_words: 
     rep_list.append(tuple(rep_line.strip().split(','))) 

Затем вы можете открыть old.txt и new.txt файлы и выполнять замену с помощью вложенного цикла для

with open('old.txt', 'rb') as old_text: 
    with open('new.txt', 'wb') as new_text: 
     for read_line in old_text: 
      new_line = read_line 
      for old_word, new in rep_list: 
       new_line = new_line.replace(old_word, new_word)) 
      new_text.write(new_line) 
+0

Я пробовал это, но только последние пары слов из csv-файла были заменены в текстовых файлах. Не знаю, где все пошло не так. Спасибо за то, что подумали! –

+0

, кстати, я не уверен, почему я сделал словарь, а затем два списка :) Спасибо за упоминание кортежей, я обязательно прочитаю еще кое-что по этому вопросу. –

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