熊猫:保存到excel编码问题

Posted

技术标签:

【中文标题】熊猫:保存到excel编码问题【英文标题】:Pandas: save to excel encoding issue 【发布时间】:2016-04-01 20:35:16 【问题描述】:

我遇到了与提到的here 类似的问题,但建议的方法都不适合我。

我有一个中等大小的 utf-8 .csv 文件,其中包含很多非 ascii 字符。 我通过其中一列中的特定值拆分文件,然后我想将每个获得的数据帧保存为 .xlsx 文件,并保留字符。

这不起作用,因为我收到一个错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 7: ordinal not in range(128)

这是我尝试过的:

    明确使用xlsxwriter 引擎。这似乎没有任何改变。

    定义一个函数(如下)来更改编码并丢弃坏字符。这也不会改变任何事情。

    def changeencode(data):
    cols = data.columns
    for col in cols:
    if data[col].dtype == 'O':
        data[col] = data[col].str.decode('utf-8').str.encode('ascii', 'ignore')
    return data   
    

    手动将所有攻击性字符更改为其他字符。仍然没有效果(在此更改后获得了引用的错误)。

    将文件编码为 utf-16(我相信这是正确的编码,因为我希望之后能够从 excel 中操作文件)也无济于事。

我认为问题出在文件本身(因为 2 和 3),但我不知道如何解决它。我会很感激任何帮助。文件的开头粘贴在下面。

"Submitted","your-name","youremail","phone","miasto","cityCF","innemiasto","languagesCF","morelanguages","wiek","partnerCF","messageCF","acceptance-795","Submitted Login","Submitted From","2015-12-25 14:07:58 +00:00","Zózia kryś","test@tes.pl","4444444","Wrocław","","testujemy polskie znaki","Polski","testujemy polskie znaki","44","test","test","1","Justyna","99.111.155.132",

编辑

一些代码(其中一个版本,没有拆分部分):

import pandas as pd
import string
import xlsxwriter

df = pd.read_csv('path-to-file.csv')

with pd.ExcelWriter ('test.xlsx') as writer:
                df.to_excel(writer, sheet_name = 'sheet1',engine='xlsxwriter')

【问题讨论】:

你试过df.to_excel(path, encoding='utf8')吗? @Stefan 我有,谢谢你的提问。可以肯定的是,我又试了一次——就在现在。还是什么都没有。 【参考方案1】:

据说这是我当时使用的pandas 版本中的一个错误。 现在,在pandas 版本中。 0.19.2,下面的代码可以毫无问题地保存问题中的 csv(并且编码正确)。 注意:openpyxl 模块必须安装在您的系统上。

import pandas as pd
df = pd.read_csv('Desktop/test.csv')
df.to_excel('Desktop/test.xlsx', encoding='utf8')

【讨论】:

@greghor 嗯,很奇怪。我刚刚安装了相同的版本,它对我有用。你安装了openpyxl 吗? 感谢您的回复,我确实安装了 openpyxl 2-5-0。苦苦挣扎了一会儿,发现如果我在加载数据时指定编码df=pd.read_csv("test.csv", encoding="utf-8"),那就可以了。【参考方案2】:

尝试将非ASCII字符的列编码为

df['col'] = df['col'].apply(lambda x: unicode(x))

然后将文件保存为 xlsx 格式,编码为 'utf8'

【讨论】:

感谢您的建议,很遗憾这不起作用。返回相同的错误,但现在由.apply 行触发。 你能在这里附上csv文件的sn-p吗? 抱歉回复晚了。我的问题中发布了应该足以触发错误的文件的一部分。你还想要更多吗?【参考方案3】:

如果您从 pandas 保存 csv 文件,然后使用 win32com 转换为 Excel 会怎样。它看起来像这样......

import win32com.client
excel = win32com.client.Dispatch("Excel.Application")
excel.Visible = 0

for x in range(10): 
    f = path + str(x)
    # not showing the pandas dataframe creation
    df.to_csv(f+'.csv')
    wb = excel.Workbooks.Open(f+'.csv')
    wb.SaveAs(f+'.xlsx', 51) #xlOpenXMLWorkbook=51

【讨论】:

以上是关于熊猫:保存到excel编码问题的主要内容,如果未能解决你的问题,请参考以下文章

如何防止excel保存后更改csv文件编码? [复制]

熊猫单热编码列到假人,包括“其他”编码[重复]

如何将本地 csv 文件的内容保存到“硬编码”Pandas DataFrame 中?

python 熊猫 - 将DataFrame保存到Excel

怎么设置excel打开csv文件时候的默认编码?

无法使用 vba 保存 excel 文件: