我有 JSON 数据,其中包含带有转义字符的文本数据字段,例如 \n
、\u4e0d
等。
使用Python 2.7,我的目标是将其“按原样”写入CSV,即\n
作为\n
和\u4e0d
如\u4e0d
。 (原始字符串)
str(data["text"]).encode('string_escape')
对于 \n
可以按预期工作,但对于 \u
则不然>,给出错误: UnicodeEncodeError: 'ascii' 编解码器无法在位置 32 编码字符 u'\u4e0d'
如果我尝试 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'))
有办法实现我的需求吗?
非常感谢
最佳答案
编程的挑战之一是如何编写非显示字符,例如执行操作而不是显示字形的换行符。 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
关于python - 使用 python 解析带有\uxxx字符的json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35145667/