我试图从MySql数据库中获取一些推文数据。 在开发此代码时,我遇到了大量的编码错误。最后一个是我运行代码并使用\ uxx字符全部获取此outfile的唯一方法,如下所示:
[{..., "lang_tweet": "es", "text_tweet": "Recuerdo un d\u00eda de, *llamada a la 1:45*, \"Micho, me va a dar algo, estoy temblando, me tome un moster y un balium... Que me muero.!!\",...},...]
我一直在这里和周围尝试不同的解决方案,但问题是我真的很困惑编码和编码的抽象。 我该怎么做才能解决这个问题? 或者可能更容易抓住脏JSON并解析'它手动解码这些字符。
如果你想查看我用来查询数据库的代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pymysql
import collections
import json
conn = pymysql.connect(host='localhost', user='sut', passwd='r', db='tweetsjun2016')
cur = conn.cursor()
cur.execute("""
SELECT * FROM 20160607_tweets
WHERE 20160607_tweets.creation_date >= '2016-06-07 10:51'
AND 20160607_tweets.creation_date <= '2016-06-07 11:51'
AND 20160607_tweets.lang_tweet = "es"
AND 20160607_tweets.has_keyword = 1
AND 20160607_tweets.rt = 0
LIMIT 20
""")
objects_list = []
for row in cur:
d = collections.OrderedDict()
d['download_date'] = row[1]
d['creation_date'] = row[2]
d['id_user'] = row[5]
d['favorited'] = row[7]
d['lang_tweet'] = row[10]
d['text_tweet'] = row[11].decode('latin1')
d['rt'] = row[12]
d['rt_count'] = row[13]
d['has_keyword'] = row[19]
objects_list.append(d)
# print(row[11].decode('latin1')) <- looks perfect, it prints with accents and fine
j = json.dumps(objects_list, default=date_handler, encoding='latin1')
objects_file = "test23" + "_dicts"
f = open(objects_file,'w')
print >> f, j
cur.close()
conn.close()
如果我从其所有应用程序中删除*.decode('latin1')
方法,我会收到此错误:
Traceback (most recent call last):
File "test.py", line 51, in <module>
j = json.dumps(objects_list, default=date_handler)
File "C:\Users\Vichoko\Anaconda2\lib\json\__init__.py", line 251, in dumps
sort_keys=sort_keys, **kw).encode(obj)
File "C:\Users\Vichoko\Anaconda2\lib\json\encoder.py", line 207, in encode
chunks = self.iterencode(o, _one_shot=True)
File "C:\Users\Vichoko\Anaconda2\lib\json\encoder.py", line 270, in iterencode
return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xed in position 13: invalid continuation byte
我真的无法弄清楚字符串从db传递到我的脚本的方式。
感谢阅读,任何想法都会感激不尽。
EDIT1:
在这里,您可以看到如何使用文本text_tweet
key-val中的编码错误导出JSON文件:
https://github.com/Vichoko/real-time-twit/blob/master/auto_labeling/json/tweets_sismos/tweetsago20160.json
答案 0 :(得分:0)
尝试将charset
关键字参数传递给connect
,如example on pymysql's github所示。
答案 1 :(得分:0)
使用json_encode
时,请添加以下额外参数:
$t = json_encode($s, JSON_UNESCAPED_UNICODE);
这将为您í
而不是\u00ed
。
(不要使用正则表达式,不要使用解码函数等,它们只会深入挖洞。)