python - Unicode (UTF-8) 在 Python 中读取和写入文件

标签 python unicode utf-8 io

我在理解读取文本和将文本写入文件(Python 2.4)方面有些脑残。

# The string, which has an a-acute in it.
ss = u'Capit\xe1n'
ss8 = ss.encode('utf8')
repr(ss), repr(ss8)

("u'Capit\xe1n'", "'Capit\xc3\xa1n'")

print ss, ss8
print >> open('f1','w'), ss8

>>> file('f1').read()
'Capit\xc3\xa1n\n'

所以我在我最喜欢的编辑器中的文件 f2 中输入 Capit\xc3\xa1n

然后:

>>> open('f1').read()
'Capit\xc3\xa1n\n'
>>> open('f2').read()
'Capit\\xc3\\xa1n\n'
>>> open('f1').read().decode('utf8')
u'Capit\xe1n\n'
>>> open('f2').read().decode('utf8')
u'Capit\\xc3\\xa1n\n'

我在这里不明白什么?显然,我缺少一些重要的魔法(或良好的感觉)。一种类型到文本文件中以获得正确的转换?

我在这里真正无法理解的是 UTF-8 表示的意义在于,如果您实际上无法让 Python 识别它,那么当它来自外部时。也许我应该只是 JSON 转储字符串,并改用它,因为它有一个 asciiable 表示!更重要的是,当从文件进入时,Python 会识别和解码这个 Unicode 对象的 ASCII 表示吗?如果有,如何获得?

>>> print simplejson.dumps(ss)
'"Capit\u00e1n"'
>>> print >> file('f3','w'), simplejson.dumps(ss)
>>> simplejson.load(open('f3'))
u'Capit\xe1n'

最佳答案

与其乱用.encode.decode,不如在打开文件时指定编码。 io module ,在 Python 2.6 中添加,提供 io.open 函数,允许指定文件的 encoding

假设文件以 UTF-8 编码,我们可以使用:

>>> import io
>>> f = io.open("test", mode="r", encoding="utf-8")

然后f.read返回一个解码后的Unicode对象:

>>> f.read()
u'Capit\xe1l\n\n'

在 3.x 中,io.open 函数是内置 open 函数的别名,它支持 encoding 参数(在 2.x 中没有)。

我们也可以使用open from the codecs standard library module :

>>> import codecs
>>> f = codecs.open("test", "r", "utf-8")
>>> f.read()
u'Capit\xe1l\n\n'

但是请注意,这个 can cause problems when mixing read() and readline() .

关于python - Unicode (UTF-8) 在 Python 中读取和写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/491921/

相关文章:

javascript - 带有 AJAX、PHP、HTML 的 UTF-8 '?' 符号

python - 在 keras-rl 中定义 Action 值

python asyncore 跟踪客户端

regex - 使用通用 Unicode 属性

delphi - 读取网页/unicode

php - 谁能告诉我这个 ascii 字符是什么?

sql - 插入时丢失特殊字符

python - 如何跳过 url 中的 Unicode 错误

python - 理解python的内存模型

java - 以编程方式将 Unicode 转换为转义的 Unicode