python:用其他文件中的单词替换文件中的单词

时间:2015-02-19 20:11:51

标签: python csv str-replace

我有一个大文本文件,其中有我要替换的单词。我将这些单词放在csv文件中,因为我不断添加和更改单词,并且不希望将单词放在python脚本本身中。在每一行上都有一个我要替换的单词,后跟我要替换它的单词。像这样:

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

我知道如何用python替换文件中的单个单词和字符串替换功能,但是当单词列在不同的文件中时,我不知道怎么做。我尽我所能,但我无法解决如何使用词典/列表/元组的问题。我对python很陌生,直到现在我还是通过互联网上的例子进行管理,但这超出了我的能力范围。我遇到了各种各样的错误,例如' unhashable类型: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))

我这样做的原因是因为我正在制作一个带有基于成分的索引的食谱,而且我不想要一个带有胡萝卜'和胡萝卜相反,我想改变胡萝卜'进入'胡萝卜'等所有其他成分。 非常感谢一群人朝着正确的方向努力!

2 个答案:

答案 0 :(得分:2)

首先从'word.csv'中创建对(old_word,new_word)的列表:

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)

但你必须一次更换一个单词。

答案 1 :(得分: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.txtnew.txt文件并使用嵌套for循环执行替换

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)