我收到了从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?谢谢!
答案 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。