Python MySQL CSV 导出到 json 奇怪的编码
Posted
技术标签:
【中文标题】Python MySQL CSV 导出到 json 奇怪的编码【英文标题】:Python MySQL CSV export to json strange encoding 【发布时间】:2017-03-07 06:40:29 【问题描述】:我收到了一个从 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' codec can't encode characters in position'
您知道如何将其转换为普通的 utf-8 字符吗?或者如何将数据转换为有效的 json?谢谢!!
【问题讨论】:
你能提供一个你试图解码的例子吗,因为只有这个错误不容易重现问题并找到可能的解决方案...... 当然,在 csv 中,字段显示如下:例如DIRECCI��N BARCELONA、v��lida hasta 等 【参考方案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
【讨论】:
嗨,Beatriz,确实,我使用 pandas 打开 csv 并使用 force_ascii=True 将它们部署到 json 中,它起作用了【参考方案2】:你可能有两个问题。但是让我们退后一步……我们无法判断文本是错误导入、导出错误还是仅仅以愚蠢的方式显示。
首先,我将讨论“导入”...
不要尝试更改编码。而是使用编码。但首先,弄清楚编码是什么。它可以是 latin1 也可以是 utf8。 (或许多不太可能的字符集。)
找出传入文件的十六进制。在 Python 中,代码类似于为字符串u
转储十六进制(等):
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 ...
table 或 column 被定义为什么并不重要; mysql 将在必要时进行转码。所有西班牙语字符都支持 latin1 和 utf8。
转到this Q&A。
我建议你有两个错误,一个是那里提到的“黑钻石”案例;还有其他的东西。但是...遵循提到的“最佳实践”。
回到你关于“出口”的问题......
再次,您需要检查输出文件的十六进制。同样,它是 latin1 还是 utf8 都没有关系。然而......如果十六进制是C383C2B3
只是ó
,你有“双重编码”。如果有,请检查是否已删除任何手动转换函数调用,并简单地告诉 MySQL 是什么。
这里还有一些您可能需要的utf8+Python tips。
如果您需要更多帮助,请按照说明一步一步操作。向我们展示用于在每一步移动/转换它的代码,并在每一步向我们展示 HEX。
【讨论】:
嗨,Rick,感谢您的精彩解释。我知道您的提示,但不幸的是,我无法访问 MySQL。我仅限于一些已经导出错误的 csv 文件:(. 你能用 Python 发现文件中的十六进制吗?也许读为“二进制”,然后看十六进制? (我不会说 Python,所以我无法提供特定的代码。)或者也许是一个 hex-dump 实用程序? 你的意思是这样的:\x89\xe3\xa2 ? 呸。\x89\xe3\xa2
在 latin1 中是 ‰ã¢
;错误地编码为 utf8、됥
韩语 (euckr) 等。应该是什么?
嗯...我看不出有办法在©
和那个十六进制89e3a3
之间找到答案。你有另一个字符串和十六进制的例子吗?【参考方案3】:
您是否尝试过使用编解码器模块?:
import codecs
....
codecs.EncodedFile(r, 'latin1').reader.read()
我记得不久前遇到过类似的问题,答案与 Python 3 之前的编码方式有关。编解码器似乎相对优雅地处理了这个问题。
正如问题 cmets 中提到的编码器,如果无法重现问题,就很难查明问题,所以我可能会找错树。
【讨论】:
我也试过了,也没有成功:(。谢谢!以上是关于Python MySQL CSV 导出到 json 奇怪的编码的主要内容,如果未能解决你的问题,请参考以下文章
如何将MYSQL中数据导出到EXCEL表中 python 脚本?