Python MySQL CSV导出到json奇怪的编码

时间:2016-10-25 09:23:19

标签: python mysql json csv utf-8

我收到了从MySQL数据库导出的csv文件(我认为编码是latin1,因为语言是西班牙语)。不幸的是,编码是错误的,我根本无法处理它。如果我使用文件:

$ file -I file.csv file.csv: text/plain; charset=unknown-8bit

我试图在python中读取文件并将其转换为utf-8,如:

r.decode('latin-1').encode("utf-8")

或使用 mysql_latin1_codec

r.decode('mysql_latin1').encode('UTF-8')

我正在尝试将数据转换为json对象。保存文件时出现错误:

'UnicodeEncodeError:'ascii'编解码器无法对位置'

中的字符进行编码

你知道我怎么能把它转换成普通的utf-8字符?或者我如何将数据转换为有效的json?谢谢!

3 个答案:

答案 0 :(得分:1)

通过使用Continuum Analytics的pandas数据框,我获得了非常好的结果。

你可以做类似的事情:

import pandas as pd
from pandas import *

con='Your database connection credentials user, password, host, database to use'
data=pd.read_sql_query('SELECT * FROM YOUR TABLE',conn=con)

然后你可以这样做:

data.to_csv('path_with_file_name')

或转换为JSON:

data.to_json(orient='records')

或者如果您更喜欢自定义json格式,请参阅此处的文档: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_json.html

答案 1 :(得分:0)

您是否尝试过使用编解码器模块?:

import codecs
....
codecs.EncodedFile(r, 'latin1').reader.read()

我记得有一段时间有类似的问题,答案与Python 3之前的编码方式有关。编解码器似乎相对优雅地处理了这个问题。

正如编码员在问题评论中提到的那样,如果不能重现问题就很难确定问题所以我可能会咆哮错误的树。

答案 2 :(得分:0)

你可能有两个问题。但是让我们退缩......我们无法判断文本输入是否错误,导出错误,还是只是以愚蠢的方式显示。

首先,我将讨论“导入”......

不要试图改变编码。而是与编码一起生活。但首先,弄清楚编码是什么。它可能是latin1或者它可能是utf8。 (或任何不太可能的字符集。)

找出传入文件的十六进制。在Python中,代码类似于为字符串u转储hex(etc):

for i, c in enumerate(u):
    print i, '%04x' % ord(c), unicodedata.category(c),
    print unicodedata.name(c)

你可以去here查看所有latin1字符的十六进制值列表,以及utf8十六进制。例如,ó是latin1 F3或utf8 C2B3

现在,知道编码,告诉MySQL。

LOAD DATA INFILE ...
    ...
    CHARACTER SET utf8  -- or latin1
    ...;

同时,定义为CHARACTER SET ...无关紧要;如有必要,mysql将进行转码。所有西班牙语字符均以latin1和utf8提供。

转到this Q&A

我建议你有两个错误,一个是那里提到的“黑钻石”案;还有别的东西。但是......遵循上面提到的“最佳实践”。

回到你的“出口”问题......

同样,您需要检查输出文件的十六进制。无论是latin1还是utf8都无关紧要。但是......如果简单C383C2B3的十六进制为ó,则表示您具有“双重编码”。如果你有,请检查你是否删除了任何手动转换函数调用,并简单地告诉MySQL什么是。

以下是您可能需要的更多utf8+Python tips

如果您需要更多帮助,请按照文字的步骤进行操作。向我们展示用于在每一步移动/转换它的代码,并在每一步向我们展示HEX。