Python 将Unicode文本写入文本文件?
我从谷歌文档中提取数据,对其进行处理,并将其写入一个文件(最终我将粘贴到Wordpress页面) 它有一些非ASCII符号。如何将这些安全地转换为可以在HTML源代码中使用的符号 目前,我正在将所有内容转换为Unicode,将所有内容合并到一个Python字符串中,然后执行以下操作:Python 将Unicode文本写入文本文件?,python,unicode,character-encoding,python-2.x,Python,Unicode,Character Encoding,Python 2.x,我从谷歌文档中提取数据,对其进行处理,并将其写入一个文件(最终我将粘贴到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
import codecs
f = codecs.open('out.txt', mode="w", encoding="iso-8859-1")
f.write(all_html.encode("iso-8859-1", "replace"))
最后一行有编码错误:
UnicodeDecodeError:“ascii”编解码器无法解码位置中的字节0xa0
12286:序号不在范围内(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"))
也许我需要写一个文本文件以外的东西 由
编解码器打开的文件。open
是一个文件,它接受unicode
数据,在iso-8859-1
中对其进行编码并将其写入文件。然而,您尝试编写的不是unicode;您自己使用unicode
并在iso-8859-1
中对其进行编码。这就是unicode.encode
方法所做的,对unicode字符串进行编码的结果是一个bytestring(一个str
类型)
您应该使用普通的
open()
自己编码unicode,或者(通常是更好的主意)使用codecs.open()
自己不编码数据。当您尝试编码非unicode字符串时,会出现错误:它尝试解码它,假设它是纯ASCII。有两种可能性:
f.write(全部html)
.encode(…)
时,它首先尝试对其进行解码通过在第一次获取unicode对象时将其解码为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')
如何将unicode字符打印到文件中: 将此保存到文件:foo.py:
#!/usr/bin/python -tt
# -*- coding: utf-8 -*-
import codecs
import sys
UTF8Writer = codecs.getwriter('utf8')
sys.stdout = UTF8Writer(sys.stdout)
print(u'e with obfuscation: é')
运行它并将输出导入文件:
python foo.py > tmp.txt
打开tmp.txt并查看内部,您会看到:
el@apollo:~$ cat tmp.txt
e with obfuscation: é
因此,您已经将带有模糊标记的unicode e保存到一个文件中。在Python 2.6+中,您可以在Python 3中使用默认值()
import io
with io.open(filename, 'w', encoding=character_encoding) as file:
file.write(unicode_text)
import io
如果您需要以增量方式写入文本(您不需要多次调用unicode\u text.encode(character\u encoding)
),可能会更方便。与编解码器
模块不同,io
模块具有适当的通用换行符支持。前言:您的查看器可以工作吗?
确保您的查看器/编辑器/终端(无论您如何与utf-8编码文件交互)可以读取该文件。这通常是记事本上的一个问题
将Unicode文本写入文本文件?
在Python 2中,使用io
模块中的open
(这与Python 3中的内置open
相同):
一般来说,最佳实践是使用UTF-8
写入文件(我们甚至不必担心UTF-8的字节顺序)
utf-8是最现代、最通用的编码——它适用于所有web浏览器、大多数文本编辑器(如果有问题,请参阅您的设置)和大多数终端/外壳
在Windows上,如果您仅限于在记事本(或其他受限查看器)中查看输出,则可以尝试使用utf-16le
只需使用上下文管理器打开它并写出您的unicode字符:
with io.open(filename, 'w', encoding=encoding) as f:
f.write(unicode_object)
使用许多Unicode字符的示例
下面是一个示例,它尝试将数字表示(以整数表示)中最多三位宽的每个可能字符(4是最大值,但这可能有点远)映射到编码的可打印输出,如果可能的话,还包括其名称(将其放入名为uni.py
)的文件中):
这应该运行大约一分钟,您可以查看数据文件,如果您的文件查看器可以显示unicode,您将看到它。可以找到有关类别的信息。基于这些计数,我们可能可以通过排除Cn和Co类别来改进我们的结果,因为它们没有相关符号
$ python uni.py
它将显示十六进制映射、符号(除非无法获取名称,所以可能是控制字符)和符号的名称。e、 g
我建议在Unix或Cygwin上使用less
(不要将整个文件打印/cat到输出中):
e、 g.将显示类似于我使用Python 2(unicode 5.2)从中采样的以下行:
我从Anaconda开发的Python3.5有unicode 8.0,我想大多数3都有。unicode字符串处理在Python3中已经标准化了
(从内存到文件自动执行32位Unicode到可变字节长度utf-8的转换。)
如果是用蟒蛇3写的话
>>> a = u'bats\u00E0'
>>> print a
batsà
>>> f = open("/tmp/test", "w")
>>> f.write(a)
>>> f.close()
>>> data = open("/tmp/test").read()
>>> data
'batsà'
如果使用python2书写:
>>> a = u'bats\u00E0'
>>> f = open("/tmp/test", "w")
>>> f.write(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)
并在读取时使用编解码器“utf-8”解码数据:
而且,如果您尝试在这个字符串上执行print,它将自动使用“utf-8”编解码器进行解码,如下所示
>>> print a
batsà
谢谢这运行时没有错误,但是如果我打开文本文件,我会看到一堆奇怪的符号:)我需要将文本复制并粘贴到Wordpress页面(不要问)。有没有什么方法可以把那里的符号打印出来?我猜不是一个txt文件,对吧,但可能是其他文件?你用什么打开文本文件?我猜你是在Windows上,你是在记事本上打开的,而记事本对编码来说并不太智能。在写字板中打开时会发生什么
$ python uni.py
$ less unidata
0 Cc NUL
20 Zs SPACE
21 Po ! EXCLAMATION MARK
b6 So ¶ PILCROW SIGN
d0 Lu Ð LATIN CAPITAL LETTER ETH
e59 Nd ๙ THAI DIGIT NINE
2887 So ⢇ BRAILLE PATTERN DOTS-1238
bc13 Lo 밓 HANGUL SYLLABLE MIH
ffeb Sm → HALFWIDTH RIGHTWARDS ARROW
out1 = "(嘉南大圳 ㄐㄧㄚ ㄋㄢˊ ㄉㄚˋ ㄗㄨㄣˋ )"
fobj = open("t1.txt", "w", encoding="utf-8")
fobj.write(out1)
fobj.close()
>>> a = u'bats\u00E0'
>>> print a
batsà
>>> f = open("/tmp/test", "w")
>>> f.write(a)
>>> f.close()
>>> data = open("/tmp/test").read()
>>> data
'batsà'
>>> a = u'bats\u00E0'
>>> f = open("/tmp/test", "w")
>>> f.write(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)
>>> f.write(a.encode("utf-8"))
>>> f.close()
>>> data = open("/tmp/test").read()
>>> data.decode("utf-8")
u'bats\xe0'
>>> print a
batsà