【发布时间】:2016-11-17 20:16:14
【问题描述】:
我正在尝试从 MySql 数据库中获取一些推文数据。 我在开发这段代码时遇到了大量的编码错误。最后一个是我运行代码并让这个输出文件充满 \uxx 字符的唯一方法,如您在此处看到的:
[{..., "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
我真的不知道字符串是如何从数据库传到我的脚本的。
感谢阅读,如有任何想法将不胜感激。
编辑1:
在这里,您可以看到 JSON 文件是如何被导出的,并在文本 text_tweet key-val 中出现编码错误:
https://github.com/Vichoko/real-time-twit/blob/master/auto_labeling/json/tweets_sismos/tweetsago20160.json
【问题讨论】:
-
我开始认为只需 解析 oufile 并找到正则表达式
\u[a-f0-9]+并将其替换为相应的值会更容易。你推荐哪种语言或工具来做这样的事情?有什么想法吗?
标签: python mysql json string encoding