使用python使用\ uxxx chracters解析json

时间:2016-02-02 05:24:30

标签: python json encoding

我有JSON数据,其中包含带有转义字符的文本数据字段,例如\n\u4e0d等。

使用Python 2.7,我的目标是将其写入CSV" as-is"即\n\n\u4e0d\u4e0d。 (原始字符串)

str(data["text"]).encode('string_escape')按预期工作\n,但不适用于\u,错误提供:UnicodeEncodeError: 'ascii' codec can't encode character u'\u4e0d' in position 32

如果我尝试data["text"]).encode('utf-8').encode('string_escape')它可以正常工作,但会像\u

那样输入\xe4\xb8\x8d
data = json.loads(line)
writer.writerow(data["text"]).encode('utf-8').encode('string_escape'))

有没有办法达到我的需要?

非常感谢

3 个答案:

答案 0 :(得分:1)

你有一个unicode字符串。您希望将其原样写入csv文件中。由于您无法在文件中写入unicode字符串,因此您尝试对其进行编码,并且它会出现一些不需要的字符,例如' \ x'。试试这个将unicode字符串转换为字符串而不添加任何不需要的字符的解决方案 -

import ast
data = u' \n \u4e0d'
str_data = ast.literal_eval(json.dumps(data))  
writer.writerow(str_data.encode('string_escape'))

答案 1 :(得分:1)

编程的一个挑战是如何编写执行动作而不是显示字形的非显示字符,例如 newline 。 Python使用反斜杠以及其他字符来表示这些字符。对于字符串,python repr函数为您提供字符串的反斜杠转义表示,就像您输入字符串一样。

如果我输入你的示例字符串并打印它,那么我得到新行和unicode字形,但是写入ascii csv会导致unicode解码错误。

>>> test = u'\n hello \u4e0d'
>>> print test

 hello 不
>>> 

但是,如果我打印字符串表示,它是我最初输入的

>>> print repr(test)
u'\n hello \u4e0d'
>>> 

如果我不想要python字符串部分,我可以将其删除

>>> print repr(test)[2:-1]
\n hello \u4e0d
>>> 

哪个更好取决于接下来该字符串会发生什么。如果你想稍后回到真正的字符串,请坚持使用python表示,然后ast.literal_eval再次将其恢复。

>>> test2 = repr(test)
>>> original = ast.literal_eval(test2)
>>> original == test
True

答案 2 :(得分:0)

尝试使用此技术将数据写入文件。首先使用base64对数据进行编码,当您想要写入文件时,只需对其进行解码并写入该数据。

>>> import base64
>>> encoded_data = '\n \u4e0d'
>>> data = base64.b64encode(encoded_data)
>>> data
'CiBcdTRlMGQ='
>>> base64.b64decode(data)
'\n \\u4e0d'
>>>