Pandas DataFrame的重音字符在Excel中出现乱码

时间:2016-03-30 02:24:23

标签: python excel csv pandas non-ascii-characters

使用:

# -*- coding: utf-8 -*-

在我的.ipynb顶部,Jupyter现在正确显示重音字符。

当我导出到csv(包含.to_csv())包含重音字符的pandas数据框时:

enter image description here

...在Excel中打开csv时,字符无法正确呈现。

enter image description here

我是否设置encoding='utf-8'是这种情况。 pandas / python是否可以在这里完成所有这些,这是一个Excel问题?或者可以在导出到csv之前完成某些事情?

  • Python:2.7.10
  • 熊猫:0.17.1
  • Excel:Excel for Mac 2011

7 个答案:

答案 0 :(得分:3)

如果您想保留重音,请尝试使用encoding ='iso-8859-1'

df.to_csv(path,encoding='iso-8859-1',sep=';')

答案 1 :(得分:2)

我也有同样的不便。当我在Jupyter笔记本中检查Dataframe时,我看到一切都井然有序。

当我尝试直接打开文件时会发生问题(因为它具有.csv扩展名,Excel可以直接打开它)。

对我来说,解决方案是打开一个新的空白excel工作簿,然后从“数据”标签导入文件,如下所示:

  • 导入外部数据
  • 从文本导入数据
  • 我选择文件
  • 在导入向导窗口的下拉列表中显示“文件来源”时,我选择了“ 65001:Unicode(utf-8)”

然后我只选择正确的定界符,对我来说就是这样。

答案 2 :(得分:1)

如果您无法让Excel合作,也许可以为您的列尝试此功能。它将使用unicodedata库删除重音:

import unicodedata

def remove_accents(input_str):

    if type(input_str) == unicode:
        nfkd_form = unicodedata.normalize('NFKD', input_str)
        return u"".join([c for c in nfkd_form if not unicodedata.combining(c)])
    else:
        return input_str

答案 3 :(得分:1)

我认为使用不同的Excel作者会有所帮助,推荐xlsxwriter

import pandas as pd
df = ...
writer = pd.ExcelWriter('file.xlsx', engine='xlsxwriter')
df.to_excel(writer)
writer.save()

答案 4 :(得分:1)

我在Mac上也有类似的问题。我注意到在TextEdit中打开csv时,unicode字符串显示正常,但是在Excel中打开时,则显示乱码。

因此,我认为没有任何方法可以使用to_csv成功地将unicode导出到Excel,但是我希望默认的to_excel编写器就足够了。

df.to_excel('file.xlsx', encoding='utf-8')

答案 5 :(得分:1)

在尝试clearinterval(ballTimer); 后跟read_json时遇到类似的问题:

to_excel

结果是,如果我先使用df = pandas.read_json(myfilepath) # causes garbled characters df.to_excel(sheetpath, encoding='utf8') # also causes garbled characters df.to_excel(sheetpath, encoding='latin1') 模块手动加载json,然后使用json导出,则不会发生此问题:

to_excel

答案 6 :(得分:0)

我遇到了同样的问题,写入.xlsx并重命名为.csv并不能解决问题(出于特定于应用程序的原因,我将不在此处介绍),也无法成功使用其他编码正如朱莉安娜·里维拉(Juliana Rivera)推荐的那样。 “手动”将数据写为文本对我有用。

with open(RESULT_FP + '.csv', 'w+') as rf:
    for row in output:
        row = ','.join(list(map(str, row))) + '\n'
        rf.write(row)

有时候,我想您只需要回到基础知识上即可。