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'编解码器无法解码字节