我很惭愧地再次寻求帮助,但我被困住了。
我有一本西班牙语小说(纯文本),我有一个 Python 脚本,它应该将困难单词的翻译放在括号中,在另一个文本文件中使用自定义词典。
经过大量的试验和错误,我设法运行了脚本,并按照应有的方式将小说写入新的文本文件。
唯一的问题是,小说中的文本没有做任何更改,也就是说,翻译没有插入文本中。字典是一个纯文本文件,它的格式如下:
[spanish word] [english translation]
[spanish word] [english translation]
等等。请注意,这些单词并没有真正括在括号中。每个单词之间只有一个空格,文件中其他任何地方都没有空格。
这是有问题的代码:
bookin = (open("novel.txt")).read()
subin = open("dictionary.txt")
for line in subin.readlines():
ogword, meaning = line.split(" ")
subword = ogword + "(meaning)"
bookin.replace(ogword, subword)
ogword = ogword.capitalize()
subword = ogword + "(meaning)"
bookin.replace(ogword, subword)
subin.close()
bookout = open("output.txt", "w")
bookout.write(bookin)
bookout.close()
建议将不胜感激。
编辑:内存错误现已解决,字典中有错误,我认为我已经修复了。非常感谢那些帮助我解决这个愚蠢问题的人!
更改:
bookin.replace(ogword, subword)
自
bookin = bookin.replace(ogword, subword)
说明:replace
不会就地更改字符串 - 实际上,字符串是不可变的 - 而是返回新版本。
正如@David罗宾逊指出的那样,问题在于你使用了替换。它应该是
bookin = bookin.replace(ogwrd, subword)
昨晚你发布你的问题时,我起床了(我投了两票问题和答案 - 我没有及时发布我自己),但这个问题一直困扰着我。即使已经发布了答案并接受了,我想提供以下建议 - 因为我相信如果可以的话生成如上所示的代码,您很可能可以找出大多数你的问题来源自主。
在这些问题中,我的建议是创建一个小的数据文件,例如 10 条记录/行,并使用它来跟踪数据您的程序通过添加一些诊断打印语句来填充它。我我在下面显示了一个版本。 它还没有完全完成,但我希望意图明确。
基本思想是验证您期望发生的一切是否都是通过查看"调试打印语句"生成的输出,实际发生在每一步。在这种情况下,您会看到 bookin
没有被修改。
bookin = (open("novel.txt")).read()
subin = open("dictionary.txt")
print 'bookin =', bookin # verify that you read the information
for line in subin.readlines():
print 'line = ', line # verify line read
ogword, meaning = line.split(" ")
print 'ogword, meaning = ', ogword, meaning # verify ...
subword = ogword + "(meaning)"
print 'subword =', subword # verify ...
bookin.replace(ogword, subword)
print 'bookin post replace =', bookin # verify ... etc
ogword = ogword.capitalize()
subword = ogword + "(meaning)"
bookin.replace(ogword, subword)
subin.close()
print 'bookout', bookout # make sure final output is good ...
bookout = open("output.txt", "w")
bookout.write(bookin)
bookout.close()
最后,Python相对于其他语言的另一个优点是你可以使用。它是交互式的。我最终经常做的是验证我的理解解释器中的功能和行为(我经常懒得看文档 - 这实际上不是一个好事情)。因此,在您的情况下,由于问题出在替换上(我的调试打印语句会向我显示这一点),我会在解释器中尝试了以下顺序
s = 'this is a test'
print s
s.replace('this', 'that')
print s
并且会看到s
没有改变,在这种情况下,我会查看了文档,或者只是尝试了s = s.replace('this',
'that')
.
我希望这是有帮助的。这种基本的调试技术通常可以帮助查明问题区域,并且是良好的第一步。下线调试器等非常有用。
PS:我是SO的新手,所以我希望这种额外的答案不是不满。
除了令人惊讶的MemoryError之外,考虑到文件的大小,您还有几处可以改进的地方; 请参阅下面的评论:
bookin = open("novel.txt").read() # don't need extra ()
subin = open("dictionary.txt")
# for line in subin.readlines():
# readlines() reads the whole file, you don't need that
for line in subin:
# ogword, meaning = line.split(" ")
# the above will leave a newline on the end of "meaning"
ogword, meaning = line.split()
# subword = ogword + "(meaning)"
# if ogword is "gato" and meaning is "cat",
# you want "gato (cat)"
# but you will get "gato(meaning)"
subword = ogword + " (" + meaning + ")"
bookin = bookin.replace(ogword, subword)
ogword = ogword.capitalize()
subword = ogword + "(meaning)" # fix this also
bookin.replace(ogword, subword) # fix this also
print len(bookin) # help debug your MemoryError
subin.close()
bookout = open("output.txt", "w")
bookout.write(bookin)
bookout.close()
您需要遵循@Levon的建议,并在一些小的测试数据文件上尝试使用代码,以便可以看到发生了什么。
使用此单行字典后:
gato cat
有了这本单行小说:
El gato se sirvió un poco de Gatorade para el "alligator".
您可能希望重新考虑您的高级策略。
在解释器中键入以下内容时,您可以获得此信息:
>>> help(str.replace)
>>> help('a'.replace)
>>> s = 'a'
>>> help(s.replace)
>>> import string
>>> help(string.replace)