Python:从字典中替换文本文件中的多个单词

时间:2015-05-02 22:24:35

标签: python python-2.7 dictionary replace text-files

我无法弄清楚我哪里出错了。因此,我需要随机替换单词并将其重新写入文本文件,直到对其他人不再有意义。我选择了一些单词来测试它,并编写了以下代码,目前无效:

# A program to read a file and replace words until it is no longer understandable

word_replacement = {'Python':'Silly Snake', 'programming':'snake charming', 'system':'table', 'systems':'tables', 'language':'spell', 'languages':'spells', 'code':'snake', 'interpreter':'charmer'}

main = open("INF108.txt", 'r+')

words = main.read().split()

main.close()

for x in word_replacement:    
    for y in words:
        if word_replacement[x][0]==y:
            y==x[1]

text = " ".join(words)

print text

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

这是文件中的文字:

  

Python是一种广泛使用的通用高级编程   语言。它的设计理念强调代码可读性及其代码   语法允许程序员用更少的代码行表达概念   比C ++或Java等语言更有可能。语言   提供用于在小型上实现清晰程序的构造   和大规模.Python支持多种编程范例,   包括面向对象,命令式和函数式编程或   程序风格。它具有动态类型系统和自动   内存管理并具有庞大而全面的标准   library.Python解释器可以在很多上安装   操作系统,允许各种Python代码执行   系统。使用第三方工具,如Py2exe或Pyinstaller,   Python代码可以打包成独立的可执行程序   一些最流行的操作系统,允许   分发基于Python的软件,以便在这些环境中使用   无需安装Python解释器。

我尝试了一些这方面的方法,但作为Python的新手,这是一个猜测的问题,过去两天花在网上进行研究,但大多数答案我都是我发现要么太复杂,要么我不明白,要么是特定于那个人的代码,并没有帮助我。

4 个答案:

答案 0 :(得分:7)

好的,让我们一步一步来。

main = open("INF108.txt", 'r+')
words = main.read().split()
main.close()

最好在此处使用with语句。此外,r是默认模式。因此:

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

使用with会在此块结束时自动为您调用main.close();你也应该为最后的文件写做同样的事情。

现在主要位:

for x in word_replacement:    
    for y in words:
        if word_replacement[x][0]==y:
            y==x[1]

这个小部分包含几个误解:

  1. 迭代字典(for x in word_replacement)只会为您提供。因此,当您想稍后进行比较时,您应该只是检查if word_replacement[x] == y。在[0]上执行此操作只会为您提供替换的第一个字母
  2. 在词典上进行迭代,首先就是打破字典的目的。只需循环覆盖您要替换的字词,然后使用y in word_replacement 检查是否在词典中。
  3. y == x[1]两种方式出错。首先,您可能希望分配给y,而不是比较(即y = x[1] - 请注意单= } 标志)。其次,分配给循环变量甚至不能做你想要的。 y下次循环时会被新值覆盖,words数据根本不会被更改。
  4. 您要做的是创建一个可能被替换的单词的 new 列表,如下所示:

    replaced = []
    for y in words:
        if y in word_replacement:
            replaced.append(word_replacement[y])
        else:
            replaced.append(y)
    text = ' '.join(replaced)
    

    现在让我们做一些改进。字典有一个方便的get方法,可以让您在密钥存在时获取值,如果不存在则获取默认值。如果我们只使用单词本身作为默认值,我们会得到一个漂亮的减少:

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

    您可以将其变成一行list-comprehension

    text = ' '.join(word_replacement.get(y, y) for y in words)
    

    现在我们已经完成了。

答案 1 :(得分:0)

看起来你想要这样的东西作为嵌套循环中的if语句:

if x==y:
    y=word_replacement[x]

当你遍历字典时,你得到它的键,而不是键值对:

>>> mydict={'Python':'Silly Snake', 'programming':'snake charming', 'system':'table'}
>>> for i in mydict:
...    print i
Python
programming
system

然后,您可以使用mydict[i]获取值。

但这并不常用,因为分配给y并不会改变words的元素。您可以遍历其索引而不是元素以分配给当前元素:

for x in word_replacement:    
    for y in range(len(words)):
        if x==words[y]:
            words[y]=word_replacement[x]

我在这里使用range()len()来获取words[0, 1, 2, ...]

的索引列表

答案 2 :(得分:0)

你的问题可能就在这里:

if word_replacement[x][0]==y:

以下是实际发生的一个小例子,可能不是你想要的:

w = {"Hello": "World", "Python": "Awesome"}
print w["Hello"]
print w["Hello"][0]

哪个应该导致:

"World"
"W"

你应该能够弄清楚如何从这里纠正代码。

答案 3 :(得分:0)

您以错误的方式使用word_replacement(字典)。您应该将for循环更改为以下内容:

for y in words:
    if y in word_replacement:
        words[words.index(y)] = word_replacement[y]