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 ... tablecolumn 被定义为什么并不重要; 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 奇怪的编码的主要内容,如果未能解决你的问题,请参考以下文章

通过 CSV 导出/导入 mysql json 对象

如何将MYSQL中数据导出到EXCEL表中 python 脚本?

将数据从 neo4j 导出到 csv 而不是 json

python 将MySQL表导出为.csv

python脚本从巨大的(60000)JSON文件目录中提取特征到csv

嵌套的json嵌入到csv python的列中