Python line.replace返回UnicodeEncodeError
Python line.replace返回UnicodeEncodeError
我有一个tex文件,是使用Sphinx从rst源文件生成的,它以UTF-8编码,没有BOM(根据Notepad++),命名为final_report.tex
,内容如下:
% 由Sphinx生成。 \documentclass[letterpaper,11pt,english]{sphinxmanual} \usepackage[utf8]{inputenc} \begin{document} \chapter{前言} Krimson4是一种不错的编程语言。 一些umlauts äöüßÅö。 这是一个“双引号”问题。 Johnny的撇号允许连接多个端口。 包含描述省略号的数据的组件... 软件互操作性 - 一些破折号 - 不可以。 \end{document}
现在,在将tex源文件编译为pdf之前,我想替换tex文件中的一些行以获得更好的结果。我的脚本受到了另一个SO问题的启发。
#!/usr/bin/python # -*- coding: utf-8 -*- import os newFil=os.path.join("build", "latex", "final_report.tex-new") oldFil=os.path.join("build", "latex", "final_report.tex") def freplace(old, new): with open(newFil, "wt", encoding="utf-8") as fout: with open(oldFil, "rt", encoding="utf-8") as fin: for line in fin: print(line) fout.write(line.replace(old, new)) os.remove(oldFil) os.rename(newFil, oldFil) freplace('\documentclass[letterpaper,11pt,english]{sphinxmanual}', '\documentclass[letterpaper, 11pt, english]{book}')
这在Ubuntu 16.04上使用Python 2.7和Python 3.5上工作,但在Windows上使用Python 3.4时失败了。我收到的错误消息是:
File "C:\Python34\lib\encodings\cp850.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u201c' in position 11: character maps to
其中201c
代表左双引号。如果我删除有问题的字符,脚本会继续执行,直到找到下一个有问题的字符为止。
最后,我需要一个在Linux和Windows上使用Python 2.7和3.x都能正常工作的解决方案。我尝试了很多在SO上提出的解决方案,但还没有找到适合我的。
Python中的line.replace返回UnicodeEncodeError的问题是因为没有正确指定编码。解决方法是在打开文件时使用encoding="the_encoding"
参数来指定正确的编码,例如:with open(oldFil, "rt", encoding="utf-8") as fin, open(newFil, "wt", encoding="utf-8") as fout:
。如果没有指定编码,将使用默认的编码,具体取决于操作系统的设置。文本模式下,如果未指定编码,则会调用locale.getpreferredencoding(False)来获取当前的locale编码。
如果仍然遇到编码问题,说明数据不是以utf-8编码。需要确保已将编码设置为utf-8,并且错误发生在写入操作上。
如果第一个错误已经修复,但仍然出现UnicodeEncodeError错误,可能是因为sys.stdout.encoding不支持显示Unicode字符。可以尝试删除用于调试的print()语句,这样其他错误就会消失。可以通过sys.stdout.encoding属性来获取当前的编码,如果编码不支持显示Unicode字符,则需要寻找其他方法来打印输出。
对于Python 2,需要使用io库中的io.open来代替open函数。可以根据Python的版本来选择使用不同的函数。在Python 3中,open函数已经等同于io.open,所以代码可以不做修改同时适用于Python 2.7和Python 3。
总结起来,解决Python中line.replace返回UnicodeEncodeError的问题可以通过指定正确的编码来解决,并且需要注意在Python 2中使用io.open代替open函数。