如何将Unicode文本写入文本文件?

252 投票
8 回答
393578 浏览
提问于 2025-04-16 17:54

我正在从一个Google文档中提取数据,处理这些数据,然后写入一个文件(最终我会把这个文件的内容粘贴到Wordpress页面上)。

里面有一些非ASCII符号。我该如何安全地把这些符号转换成可以在HTML源代码中使用的符号呢?

目前,我在提取数据时把所有内容都转换成Unicode,然后把它们放在一个Python字符串里,接着执行:

import codecs
f = codecs.open('out.txt', mode="w", encoding="iso-8859-1")
f.write(all_html.encode("iso-8859-1", "replace"))

但是在最后一行出现了编码错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 12286: ordinal not in range(128)

部分解决方案:

这个Python代码运行没有错误:

row = [unicode(x.strip()) if x is not None else u'' for x in row]
all_html = row[0] + "<br/>" + row[1]
f = open('out.txt', 'w')
f.write(all_html.encode("utf-8"))

但是当我打开实际的文本文件时,看到里面有很多这样的符号:

Qur’an 

也许我需要写入其他格式的文件,而不是文本文件?

8 个回答

82

在Python 3中,处理Unicode字符串的方式已经标准化了。

  1. 字符在内存中已经以Unicode(32位)格式存储。
  2. 你只需要以utf-8格式打开文件就可以了。
    (从内存到文件的转换,会自动把32位的Unicode转换成可变字节长度的utf-8格式。)

    out1 = "(嘉南大圳 ㄐㄧㄚ ㄋㄢˊ ㄉㄚˋ ㄗㄨㄣˋ )"
    fobj = open("t1.txt", "w", encoding="utf-8")
    fobj.write(out1)
    fobj.close()
    
82

在Python 2.6及以上版本中,你可以使用io.open(),这个在Python 3中是默认的(也就是内置的open()):

import io

with io.open(filename, 'w', encoding=character_encoding) as file:
    file.write(unicode_text)

如果你需要逐步写入文本,这样会更方便(你不需要多次调用unicode_text.encode(character_encoding))。和codecs模块不同,io模块对各种换行符的支持更好。

343

尽量只使用unicode对象,也就是说,当你第一次获取数据时,就把它解码成unicode对象;在需要输出的时候再编码成其他格式。

如果你的字符串实际上是一个unicode对象,那么在写入文件之前,你需要把它转换成一个unicode编码的字符串对象:

foo = u'Δ, Й, ק, ‎ م, ๗, あ, 叶, 葉, and 말.'
f = open('test', 'w')
f.write(foo.encode('utf8'))
f.close()

当你再次读取这个文件时,你会得到一个unicode编码的字符串,然后你可以把它解码成unicode对象:

f = file('test', 'r')
print f.read().decode('utf8')

撰写回答