我正在加载带有一堆unicode字符的文件(例如\xe9\x87\x8b
)。我想在Python中将这些字符转换为它们的转义 - unicode格式(\u91cb
)。我在StackOverflow上发现了一些类似的问题,其中包括Evaluate UTF-8 literal escape sequences in a string in Python3,这几乎完全符合我的要求,但我无法解决如何保存数据的问题。
例如: 输入文件:
\xe9\x87\x8b
Python脚本
file = open("input.txt", "r")
text = file.read()
file.close()
encoded = text.encode().decode('unicode-escape').encode('latin1').decode('utf-8')
file = open("output.txt", "w")
file.write(encoded) # fails with a unicode exception
file.close()
输出文件(我想要):
\u91cb
答案 0 :(得分:3)
您需要使用unicode-escape
编码再次对其进行编码。
>>> br'\xe9\x87\x8b'.decode('unicode-escape').encode('latin1').decode('utf-8')
'釋'
>>> _.encode('unicode-escape')
b'\\u91cb'
修改了代码(使用二进制模式减少不必要的编码/解码)
with open("input.txt", "rb") as f:
text = f.read().rstrip() # rstrip to remove trailing spaces
decoded = text.decode('unicode-escape').encode('latin1').decode('utf-8')
with open("output.txt", "wb") as f:
f.write(decoded.encode('unicode-escape'))
答案 1 :(得分:1)
\xe9\x87\x8b
不是Unicode字符。它看起来像是一个字节串的表示,表示使用utf-8字符编码编码的釋
Unicode字符。 \u91cb
是Python源代码(或JSON格式)中釋
字符的表示。不要混淆文本表示和角色本身:
>>> b"\xe9\x87\x8b".decode('utf-8')
u'\u91cb' # repr()
>>> print(b"\xe9\x87\x8b".decode('utf-8'))
釋
>>> import unicodedata
>>> unicodedata.name(b"\xe9\x87\x8b".decode('utf-8'))
'CJK UNIFIED IDEOGRAPH-91CB'
要从文件中读取编码为utf-8的文本,请明确指定字符编码:
with open('input.txt', encoding='utf-8') as file:
unicode_text = file.read()
将Unicode文本保存到文件完全相同:
with open('output.txt', 'w', encoding='utf-8') as file:
file.write(unicode_text)
如果省略显式encoding
参数,则使用locale.getpreferredencoding(False)
,如果它与用于保存文件的实际字符编码不对应,则可能产生mojibake。
如果您的输入文件字面上包含\xe9
(4个字符),那么您应该修复生成它的任何软件。如果您需要使用'unicode-escape'
;有些东西坏了。
答案 2 :(得分:0)
看起来您的输入文件是UTF-8编码的,因此在打开文件时指定UTF-8编码(根据您的参考假定Python3):
with open("input.txt", "r", encoding='utf8') as f:
text = f.read()
text
将包含文件内容为str
(即unicode字符串)。现在,您可以通过指定encoding='unicode-escape'
:
with open('output.txt', 'w', encoding='unicode-escape') as f:
f.write(text)
您文件的内容现在将包含unicode-escaped literals:
$ cat output.txt
\u91cb