【问题标题】:Python: replacing multiple words in a text file from a dictionaryPython:从字典中替换文本文件中的多个单词
【发布时间】:2015-07-12 13:00:39
【问题描述】:

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

# 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 新手,这只是猜测的问题,最近两天在网上研究它,但我发现的大多数答案要么太复杂,不适合我理解,或特定于那个人的代码,不要帮助我。

【问题讨论】:

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


    【解决方案1】:

    看起来你想要这样的东西作为嵌套循环中的 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】:

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

      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 数据根本不会改变。

      您要做的是创建一个可能被替换的单词列表,如下所示:

      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)
      

      现在我们完成了。

      【讨论】:

      • 谢谢,这解决了我的问题,并帮助我理解它!非常感谢。
      【解决方案3】:

      您的问题可能在这里:

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

      这是实际发生的事情的一个小例子,这可能不是您想要的:

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

      这应该导致:

      "World"
      "W"
      

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

      【讨论】:

      • 我知道我做错了什么......调用了错误的东西。
      【解决方案4】:

      您以错误的方式使用了word_replacement(这是一本字典)。你应该把 for 循环改成这样:

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

      【讨论】:

        猜你喜欢
        • 2017-08-25
        • 1970-01-01
        • 2020-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-22
        • 1970-01-01
        • 2015-01-30
        相关资源
        最近更新 更多