如何打开ascii编码的文件为UTF8?

时间:2012-09-11 13:51:09

标签: python file-io utf-8 io ascii

我的文件是US-ASCII,像a = file( 'main.html')a.read()这样的命令将它们作为ASCII文本加载。如何将其加载为UTF8?

我要解决的问题是:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xae' in position 38: ordinal not in range(128)

我正在使用template_str.format(attrib=val)中的文件内容进行模板化。但是要插入的字符串是ASCII的超集。

我们团队的版本控制和文本编辑器不关心编码。那么如何在代码中处理它呢?

3 个答案:

答案 0 :(得分:6)

在Python2中使用的解决方案:

import codecs
fo = codecs.open('filename.txt', 'r', 'ascii')
content = fo.read()  ## returns unicode
assert type(content) == unicode
fo.close()

utf8_content = content.encode('utf-8')
assert type(utf8_content) == str

答案 1 :(得分:6)

您试图在不指定编码的情况下打开文件,这意味着python使用默认值(ASCII)。

您需要使用.decode()函数显式解码字节字符串:

 template_str = template_str.decode('utf8')

你试图插入到模板中的val变量本身就是一个unicode值,而python想要自动将你的字节串模板(从文件中读取)转换为unicode值,这样就可以了将两者结合起来,它将使用默认编码来执行此操作。

我是否已经提到你应该阅读Joel Spolsky的article on UnicodePython Unicode HOWTO?他们会帮助你理解这里发生的事情。

答案 2 :(得分:1)

我认为您确定您的文件是用ASCII编码的。你是? :)由于ASCII包含在UTF-8中,您可以使用UTF-8解码此数据,而不会出现问题。但是,当您确定数据只是ASCII时,您应该使用ASCII而不是UTF-8解码数据。

“如何将其加载为UTF8?”

我相信你的意思是“如何将其作为unicode加载?”。使用ASCII编解码器解码数据,在Python 2.x中,结果数据的类型为unicode。在Python 3中,结果数据的类型为str

您必须阅读有关此主题的内容,以了解如何在Python中执行此类解码。一旦理解,这很简单。