熊猫:保存到excel编码问题

时间:2015-12-27 23:28:11

标签: python excel pandas encoding utf-8

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

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

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

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

以下是我的尝试:

  1. 明确使用xlsxwriter引擎。这似乎没有改变任何东西。
  2. 定义一个函数(下面)来改变编码并丢弃坏字符。这也没有任何改变。

    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   
    
  3. 手动将所有攻击性的角色改为其他人。仍然没有效果(在此更改后获得引用的错误)。

  4. 将文件编码为utf-16(我相信,这是正确的编码,因为我希望之后能够在excel中操作文件)也不会有任何帮助。< / p>

  5. 我认为问题出在文件本身(因为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')
    

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

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

然后使用编码'utf8'

将文件保存为xlsx格式

答案 2 :(得分:0)

如果您从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