Python pandas to_excel'utf8'编解码器无法解码字节

Posted

技术标签:

【中文标题】Python pandas to_excel\'utf8\'编解码器无法解码字节【英文标题】:Python pandas to_excel 'utf8' codec can't decode bytePython pandas to_excel'utf8'编解码器无法解码字节 【发布时间】:2013-09-09 19:45:53 【问题描述】:

我正在尝试在 Python pandas 中进行一些数据工作,但在写出我的结果时遇到了麻烦。 我将我的数据作为 CSV 文件读取,并将每个脚本导出为它自己的 CSV 文件,它工作正常。最近虽然我尝试使用工作表将所有内容导出到 1 个 Excel 文件中,但其中一些工作表给了我一个错误

“'utf8'编解码器无法解码位置1的字节0xe9:无效的继续字节”

我什至不知道如何开始查找可能导致导出到 Excel 出现问题的任何字符。不知道为什么它可以很好地导出到 CSV :(

相关行

from pandas import ExcelWriter
data = pd.read_csv(input)
writer = ExcelWriter(output) #output is just the filename
fundraisers.to_excel(writer, "fundraisers")
locations.to_excel(writer, "locations") #error
locations.to_csv(outputcsv) #works
writer.save()

违规数据帧的打印头

Event ID    Constituent ID  Email Address   First Name  \   Last Name
f       1       A       A       1
F       4       L       R       C
M       1       1       A       D
F       4       A       A       G
M       2       0       R       G
M       3       O       O       H
M       2       T       E       H
M       2       A       A       H
M       2       M       M       K
F       3       J       E       K
Location ID raised  raised con  raised email
a   0   0   0
a   8   0   0
o   0   0   0
o   0   0   0
o   0   0   0
t   5   0   0
o   1   0   0
o   6   a   0
o   6   0   0
d   0   0   0

查看 excel 表我确实得到了部分打印。名字列及以后的任何内容都是空白的,但事件、组成部分和电子邮件都会打印出来。

edit:尝试以 utf8 格式读取 csv 失败,但以 latin1 格式读取它可以。有没有办法指定 to_excel 编码?或者将我的数据帧解码并编码为 utf8?

【问题讨论】:

你能发布一些可能有问题的 unicode 字符吗?生成随机的希伯来语字符然后编写它们对我来说没问题。 我不知道如何找到它认为令人反感的角色。 CSV 不同的一个原因是因为 Excel 导出不是由 pandas 完成的,而是由第三方库(xlwt 和/或 openpyxl)完成的。 相关:***.com/questions/5552555/… 过去我在将 CSV 文件读入使用 utf8 编码但未指定编码的 Pandas 时遇到过问题。例如尝试 pd.read_csv(input, encoding='utf-8') 和类似的写入。或者,也许您有“latin-1”输入数据 - 似乎在谷歌搜索中弹出您的错误。 【参考方案1】:

设法解决了这个问题。

我创建了一个函数,它遍历包含字符串的列,并设法将它们解码/编码为 utf8,现在它可以工作了。

def changeencode(data, cols):
    for col in cols:
        data[col] = data[col].str.decode('iso-8859-1').str.encode('utf-8')
    return data   

【讨论】:

谢谢!这个功能非常有用。 Pandas 内置这种类型的功能会很有帮助,而不是仅仅抛出一个不够深刻的错误(或至少识别它遇到问题的第一行和第一列)。【参考方案2】:

不知道什么时候发布,但是你可以试试我的 github 仓库:

https://github.com/jtornero/pandas

您可以克隆它并从源代码构建熊猫;这个问题几乎解决了,它就像

sampleList = ['Miño', '1', '2', 'señora']
dataframe = pandas.DataFrame(sampleList)
ew = pandas.ExcelWriter('./test.xls', encoding='utf-8')
dataframe.to_excel(ew)
ew.save()

干杯

豪尔赫·托内罗

【讨论】:

【参考方案3】:

其实有一种方法可以通过给ExcelWriter传一个参数来强制utf8编码:

 ew = pandas.ExcelWriter('test.xlsx',options='encoding':'utf-8')
 sampleList = ['Miño', '1', '2', 'señora']
 dataframe = pandas.DataFrame(sampleList)
 dataframe.to_excel(ew)
 ew.save()

【讨论】:

.to_csv 中也有一个可选的encoding 参数。【参考方案4】:

就我而言,问题在于我最初读取 CSV 文件的编码错误(ASCII 而不是cp1252)。因此,当 pandas 尝试将其写入 Excel 文件时,它发现了一些无法解码的字符。

我通过在读取 CSV 文件时指定正确的编码解决了这个问题。

data = pd.read_csv(fname, encoding='cp1252')

【讨论】:

【参考方案5】:

最简单的方法是以 utf-8 格式加载数据帧。然后它 ExcelWriter 将保存它没有问题。

data = pd.read_csv(path,encoding='utf-8')

【讨论】:

【参考方案6】:

与@Zenadix 所说的类似,以 UTF-8 格式读取 csv 允许 ExcelWriter 写入而不会出现错误。

df = pd.read_csv('path', encoding='utf-8')

...

with pd.ExcelWriter('new_path') as writer:
    df.to_excel(writer, sheet_name='Foo')


【讨论】:

以上是关于Python pandas to_excel'utf8'编解码器无法解码字节的主要内容,如果未能解决你的问题,请参考以下文章

遇到问题--python--pandas--dataframe进行groupby之后导出数据to_excel内容为空

遇到问题--python--pandas--dataframe进行groupby之后导出数据to_excel内容为空

Python pandas to_excel'utf8'编解码器无法解码字节

Python之Pandas的常用技能写入数据

如何使用 pandas.to_excel() 创建 Excel **Table**?

在 Python 中使用 MultiIndex 和 to_excel 时创建的标题下方的空行