我有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'))
有没有办法达到我的需要?
非常感谢
答案 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'
>>>