Python 脚本将文本写入文件,但不添加它应该添加的文本



我很惭愧地再次寻求帮助,但我被困住了。

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

相关内容

  • 没有找到相关文章

最新更新