Python 2.7 Unicode问题:存储推文到JSON出现转义字符
解决Twitter流数据保存JSON时Unicode转义字符问题
嘿,我懂你现在的困扰——用Tweepy存推文到JSON文件,结果里面全是\u0e40\u0e21这类Unicode转义码,换了好几种编码都没解决,对吧?其实问题根本不在编码上,而是你处理数据的方式搞错了。
问题根源
Twitter API返回的data本身就是已经序列化完成的JSON字符串,里面的\uXXXX是JSON标准的Unicode转义格式。你直接把这个字符串写入文件,自然会保留这些转义符号——哪怕你指定了utf-8编码,也只是把转义后的字符串以utf-8编码保存而已,完全没处理里面的转义内容。
解决方案:解析后重新序列化
我们需要先把JSON字符串解析成Python原生对象(字典/列表),然后再重新序列化为JSON文件,同时告诉序列化器不要转义非ASCII字符。具体修改你的代码如下:
首先确保导入json模块,然后调整on_data方法:
import json import codecs def on_data(self, data): try: # 第一步:把API返回的JSON字符串解析成Python对象 tweet_obj = json.loads(data) # 第二步:以追加模式写入文件,指定不转义Unicode字符 with codecs.open('python.json', 'a', encoding='utf-8') as f: # ensure_ascii=False 是核心,直接输出原始Unicode字符 json.dump(tweet_obj, f, ensure_ascii=False) f.write('\n') # 每个推文单独占一行,方便后续读取处理 print("Tweet ajouté au JSON") return True except BaseException as e: print("Error on_data: %s" % str(e)) return True
关键改动说明
json.loads(data):这一步把转义后的JSON字符串转换成Python字典,此时里面的非ASCII字符(比如你看到的泰文)会变成Python原生的Unicode字符串,不再是转义码。json.dump(..., ensure_ascii=False):这个参数告诉JSON序列化器,不要把非ASCII字符转义成\uXXXX,直接输出原始的可读字符。- 追加换行符:让每个推文单独占一行,这样你的文件会变成JSON Lines格式,既方便后续按行读取处理,也避免了直接追加多个JSON对象导致整个文件无效的问题。
如果之前的文件已经有转义内容,你可以写个小脚本读取旧文件,解析后重新写入,就能把所有转义码转换成可读的Unicode字符啦。
内容的提问来源于stack exchange,提问作者Ravure
相关产品推荐
相关产品推荐

