Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python将文本文件中的字符串替换为列表中的值_Python_String_Replace - Fatal编程技术网

Python将文本文件中的字符串替换为列表中的值

Python将文本文件中的字符串替换为列表中的值,python,string,replace,Python,String,Replace,我的问题是用另一个字符串替换文本文件中的字符串。这些关键字字符串位于一个名为word_list的列表中。我尝试了以下方法,但似乎没有任何效果。它按原样打印document.text中的句子,无需替换: word_list = {'hi' : 'test', 'how' : 'teddy'} with open("document.txt") as main: words = main.read().split() replaced = [] for y in

我的问题是用另一个字符串替换文本文件中的字符串。这些关键字字符串位于一个名为word_list的列表中。我尝试了以下方法,但似乎没有任何效果。它按原样打印document.text中的句子,无需替换:

  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?
任何解决方案/帮助都将不胜感激:)

这将读取文件的全部内容(如果是大文件,则不是最有效的),然后迭代搜索并替换字典中的项目,并对输入文本调用replace。完成后,它会将数据写入新文件

使用这种方法需要记住的一些事情

  • 如果您的输入文件很大,则速度会很慢
  • 您的搜索模式还可以匹配单词片段,即
    hi
    将观看
    哪个
    ,因此您也应该满足这一要求

由于您似乎想替换单词,这将使用更自然的“单词”定义:

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))

当您可以使用
replace
方法
word\u list
是一本字典,尽管它的名称不同,但您为什么要经历所有这些呢。。。另外,当您在最后创建
文本时,您完全忽略了
替换的
,而宁愿使用生成器表达式。您的代码对我有效吗?“它在document.text中打印出句子”->您检查过done.txt文件了吗?您的代码工作正常。你的问题是什么?我知道,这就是为什么我要编辑它,以包括一些幼稚方法的警告。@ChristianWitts你的解决方案工作,谢谢:)但是,如果我想避免替换其他字符串的单词片段,该如何做呢?@user47467使用正则表达式,如panda的回答中所示,用
\b
表示“单词边界”,但我建议使用不同的正则表达式。。。请参阅注释。最好使用
r“\b”(“+”|“)。将(单词列表)+r“\b”作为模式加入,
,这样就不会不必要地替换每个单词。另外,如果这些单词包含不寻常的字符,
\w
将不起作用。@tobias_k,测试每个单词的N个变体是O(N),而不必要地替换它是O(1)(尽管可能需要更长的操作)。平衡点在哪里是一个貌相的问题。根据定义,w是一个单词符号。如果您有N个备选方案,则必须检查每个备选方案,直到找到正确的一个,regexp引擎无法执行任何其他操作。python集与dict没有区别,两者都是O(1)average@tobias_k,我在一本简陋的10000字字典上测试了它,果然,联接的regexp子操作的运行速度慢425倍
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))