从outfile中获取编码问题的数据库中的字符串

时间:2016-11-17 20:16:15

标签: python mysql json string encoding

我试图从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

2 个答案:

答案 0 :(得分:0)

尝试将charset关键字参数传递给connect,如example on pymysql's github所示。

答案 1 :(得分:0)

使用json_encode时,请添加以下额外参数:

$t = json_encode($s, JSON_UNESCAPED_UNICODE);

这将为您í而不是\u00ed

(不要使用正则表达式,不要使用解码函数等,它们只会深入挖洞。)