2016-02-16 101 views
0

我想從熊貓數據框寫入數據到Excel文件。我使用pyExcelerate而不是內置的to_excel()方法來獲得更好的性能。用pyExcelerate編寫特殊字符?如何保持utf-8編碼?

雖然Pandas處理utf-8編碼的特殊字符,但編碼在轉換爲python列表時似乎會丟失。 我通過https://docs.python.org/2/howto/unicode.html閱讀,但我無法找到如何保留編碼。或者有什麼方法可以在編寫時恢復編碼?

# -*- coding: utf-8 -*- 
import pandas as pd 
from pyexcelerate import Workbook 

df = pd.DataFrame({'val': ['ä']}) 
print df 
# val 
# 0 ä <- non ascii character a with dots 

value = df.values.tolist() 
print value 
# [['\xc3\xa4']] 

wb = Workbook() 
ws = wb.new_sheet("sheet name", data=value) 
wb.save("output.xlsx") 

# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 31: ordinal not in range(128) 
+0

你偶然會在文件頂部有'# - * - coding:utf-8 - * - '?從[這裏](http://stackoverflow.com/questions/10589620/syntaxerror-non-ascii-character-xa3-in-file-when-function-returns-%C2%A3) –

+1

FWIW,''\ xc3 \ xa4'是_'的UTF-8編碼;如果我們將它解碼爲Unicode(例如''\ xc3 \ xa4'.decode('utf8')'),我們會得到'u'\ xe4''。您可能會發現這篇文章有用:[Pragmatic Unicode](http://nedbatchelder.com/text/unipain.html),它由SO老將Ned Batchelder編寫。 –

+0

'# - * - coding:utf-8 - * - '在代碼中(編輯我的示例)。如果它不在那裏,我已經在創建DataFrame時出錯。 – malte

回答

1

簡單,通過使用Unicode文本飼料與統一碼的數據幀:

df = pd.DataFrame({u'val': [u'ä']}) 

注意u前綴

確保您的文件進行編碼,UTF-8(匹配# -*- coding: utf-8 -*-頭部)(它的確看起來像UTF-8編碼爲0xc3ä的第一個字節)

錯誤是由於Python不知道字節字符串的編碼而導致的,此後將該字符串編組爲Unicode對象。

+0

添加'u'前綴解決了問題。要在現有的列上添加「u」,我使用了'df ['val'] = df ['val']。str.decode('utf8')' – malte