如何使用 pandas to_exel 将字符串保存为 .xlsx 中的“utf-8”格式(to_csv 能够将其保存为 .csv)

Posted

技术标签:

【中文标题】如何使用 pandas to_exel 将字符串保存为 .xlsx 中的“utf-8”格式(to_csv 能够将其保存为 .csv)【英文标题】:how to save string in 'utf-8' format in a .xlsx using pandas to_exel (to_csv is able to save it as .csv) 【发布时间】:2017-02-28 17:02:01 【问题描述】:

因为我能够使用 to_csv 使用 'utf-8' 编码来保存字符串,所以我希望能够使用 to_excel 来做同样的事情。这对我来说不是编码问题。之前看到的帖子都没有,讨论这个问题。

我在 Windows 7(Anaconda) 和 pandas 0.18.1 上使用 python 2.7.12

我有 2 个关于将包含特殊字符(编码为“utf-8”)的熊猫数据框保存为 .csv 或 .xlsx 文件的问题。

例如:

import pandas as pd

# Create a Pandas dataframe from the data.
df = pd.DataFrame('Data': ['1', 'as', '?%','ä'])

我可以毫无问题地将数据框保存为 .cvs 文件:

df.to_csv('test_csv.csv',sep=',', encoding='utf-8')

它有效。导入数据时,我需要在 Excel 中选择“utf-8”,一切都很好。

现在,如果我尝试将相同的数据帧保存为 .xlsx,则它不起作用。

我有以下代码:

 # Create a Pandas Excel writer using XlsxWriter as the engine.
writer = pd.ExcelWriter('pandas_simple.xlsx', engine='xlsxwriter',   options='encoding':'utf-8')

# Convert the dataframe to an XlsxWriter Excel object.
df.to_excel(writer, sheet_name='Sheet1',encoding='utf-8')
writer.save()

我收到以下错误消息:

UnicodeDecodeError: 'ascii' 编解码器无法解码位置上的字节 0xc3 7:序数不在范围内(128)

我不是 100% 确定使用正确的选项来设置编码:

options='encoding':'utf-8'

encoding='utf-8'

因为我不清楚如何从文档中着手。

知道如何让它工作吗?

与 df.to_csv 相关的额外问题。有没有办法使用一些特殊字符作为分隔符?出于某种原因,我从 R 迁移到 python 的代码使用 sep='¤'。试图以所有可能的方式编码这个特殊字符,但总是失败。有可能吗?

非常感谢

干杯

法比恩

【问题讨论】:

Pandas: save to excel encoding issue的可能重复 favorite 这个问题在这里可能已经有了答案:Pandas: save to excel encoding issue 2 answers 因为我可以使用'utf-8'编码使用to_csv保存字符串,我期待这样做能够使用 to_excel 做同样的事情。这对我来说不是编码问题。我之前看到的帖子都没有,讨论这个问题。如果我错了,请纠正我。 【参考方案1】:

如果您使用 xlsxwriter 作为 Excel 写入引擎,则 encoding='utf-8' 将被忽略,因为 XlsxWriter 模块不使用它。

XlsxWriter 要求字符串数据编码为utf8。之后它会自动处理字符串。

因此,您需要确保您正在写入的字符串数据通过 Pandas 编码为utf8:无论是在您读取它时还是在数据进入数据帧之后。

【讨论】:

谢谢@jmcnamara,这解释了我的问题。通过修复数据框中的编码来解决我的问题。

以上是关于如何使用 pandas to_exel 将字符串保存为 .xlsx 中的“utf-8”格式(to_csv 能够将其保存为 .csv)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用空值将字符串转换为日期时间 - python,pandas?

如何使用 pandas 将多行字符串合并为一个?

如何将 csv 字符串转换为 pandas 中的列表?

如何将 csv 字符串转换为 pandas 中的列表?

Pandas / 如何将存储为字符串的科学记数法转换为浮点数?

如何将栅格保存在包中