3

我很惭愧再次求助于求助,但我被困住了。

我有一本西班牙小说(纯文本),我有一个 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()

建议将不胜感激。

编辑: MemoryError 现在已经解决了,我以为我已经修复的字典中有错误。非常感谢那些帮助我解决这个愚蠢问题的人!

4

4 回答 4

7

改变:

bookin.replace(ogword, subword)

bookin = bookin.replace(ogword, subword)

解释:replace不会原地改变字符串——事实上,字符串是不可变的——相反,它返回一个新版本。

于 2012-04-17T05:16:18.140 回答
2

正如@David Robinson 指出的那样,问题在于您使用了替换。应该是

 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:我是新来的,所以我希望这种额外的答案不会被反对。

于 2012-04-17T11:27:43.197 回答
1

在解释器中输入这些信息时,您可以获得此信息:

>>> help(str.replace)  
>>> help('a'.replace)  
>>> s = 'a'  
>>> help(s.replace)  
>>> import string  
>>> help(string.replace)
于 2012-04-17T10:54:40.000 回答
1

除了令人惊讶的 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".

您可能希望重新考虑您的高级策略。

于 2012-04-17T12:18:41.083 回答