【发布时间】:2016-04-17 14:31:54
【问题描述】:
我正在使用 Python 2.7.6。
有一个 HTML 文件,其中包含以“$”开头的值。编写了一个程序,它接收 JSON 数据并将前面带有 $ 的值替换为 JSON 值。
在有人用不同的编辑器打开这组 HTML 文件并将其从 UTF-8 更改为 ASCII 之前,这一切正常。
class FileUtil:
@staticmethod
def replace_all(output_file, data):
homedir = os.path.expanduser("~")
dest_dir = homedir + "/dest_dir"
with open(output_file, "r") as my_file:
contents = my_file.read()
destination_file = dest_dir + "/" + data["filename"]
fp = open(destination_file, "w")
for key, value in data.iteritems():
contents = contents.replace("$" + str(key), value)
fp.write(contents)
fp.close()
每当我的程序遇到一个 ASCII 格式的文件时,它就会抛出这个错误:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/application.py", line 239, in process
return self.handle()
File "/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/application.py", line 230, in handle
return self._delegate(fn, self.fvars, args)
File "/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/application.py", line 420, in _delegate
return handle_class(cls)
File "/usr/local/lib/python2.7/dist-packages/web.py-0.37-py2.7.egg/web/application.py", line 396, in handle_class
return tocall(*args)
FileUtil.replace_all(output_file, data)
File "/home/devuser/demo/utils/fileutils.py", line 11, in replace_all
contents = contents.replace("$" + str(key), value)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 54826: ordinal not in range(128)
问题:
有没有办法让python中的内容值严格为UTF-8?
在运行此 python 脚本之前,使用 Ubuntu Linux 中的命令行实用程序转换文件是否更好?
错误是否是编码问题(例如文件是 ASCII 而不是 UTF8)?
【问题讨论】:
-
使用
codecs打开文件并处理编码。如果您只需要 UTF-8,则在 Unicode 错误上失败。 -
您可以使用
iconv转换文件,但如果文件不遵循编码,您将使用什么来转换它?一方面,文件不是 ASCII,因为 ASCII 不使用超过 127 的字节值,这正是错误告诉你的,顺便说一句。在任何情况下,我都会考虑将 Python 升级到版本 3,因为对编码的大部分处理都得到了改进。最后,在线搜索错误信息,了解它的含义,这里有数百个类似的问题,你的并没有增加多少。 -
问题似乎正好相反。您的程序使用默认的“ascii”编解码器,并且文件不是 ASCII。如果该文件是在 Windows 中打开的,它很可能已更改为“latin-1”。使用
codecs.open()以所需编码打开文件。您可以使用chardet 之类的包来检测文件的编码。 -
roeland - 这是一个不同的问题,恕我直言。
标签: python unicode utf-8 ascii python-unicode