2013-09-05 3 views
16

Я пытаюсь выполнить некоторую работу с данными в Pandon pandas и не могу написать свои результаты. Я прочитал свои данные как CSV-файл и экспортировал каждый скрипт, как собственный CSV-файл, который отлично работает. В последнее время, хотя я пытался экспортирующей все в 1 Excel файл с рабочими листами и несколько листов дают мне ошибкуPython pandas to_excel 'utf8' codec не может декодировать байт

«„utf8“кодек не может декодировать байт 0xe9 в положении 1: недопустимый продолжение байт»

Я не знаю, как начать поиск любых символов, которые могут вызвать проблемы с экспортом в Excel. Не уверен, почему это экспорт в CSV просто отлично, хотя :(

соответствующие строки

from pandas import ExcelWriter 
data = pd.read_csv(input) 
writer = ExcelWriter(output) #output is just the filename 
fundraisers.to_excel(writer, "fundraisers") 
locations.to_excel(writer, "locations") #error 
locations.to_csv(outputcsv) #works 
writer.save() 

печатающая головка нарушившей dataframe

Event ID Constituent ID Email Address First Name \ Last Name 
f  1  A  A  1 
F  4  L  R  C 
M  1  1  A  D 
F  4  A  A  G 
M  2  0  R  G 
M  3  O  O  H 
M  2  T  E  H 
M  2  A  A  H 
M  2  M  M  K 
F  3  J  E  K 
Location ID raised raised con raised email 
a 0 0 0 
a 8 0 0 
o 0 0 0 
o 0 0 0 
o 0 0 0 
t 5 0 0 
o 1 0 0 
o 6 a 0 
o 6 0 0 
d 0 0 0 

смотрит на лист первенствовать я на самом деле получить частичную распечатку Все, что находится в столбце с именем и за ним, пустое, но событие, составляющее и отправляет по электронной почте всю печать.

Редактировать: попытка чтения csv в качестве utf8 завершается с ошибкой, но чтение он работает как латинский. Есть ли способ указать кодировку to_excel? Или декодировать и кодировать мою фреймворк в utf8?

+0

Можете ли вы опубликовать некоторые из ваших, возможно, обидных символов Юникода? Генерация случайных символов на иврите, а затем их запись работает хорошо для меня. –

+2

Я понятия не имею, как найти персонажа, который он находит оскорбительным. – Wizuriel

+0

Одна из причин, по которой CSV отличается, потому что экспорт Excel не выполняется 'pandas', это делается сторонними библиотеками (' xlwt' и/или 'openpyxl'). –

ответ

17

Умение решить эту проблему.

Я сделал функцию, которая проходит через мои столбцы, которые имеют строки и которым удалось декодировать/закодировать их в utf8, и теперь она работает.

def changeencode(data, cols): 
    for col in cols: 
     data[col] = data[col].str.decode('iso-8859-1').str.encode('utf-8') 
    return data 
+7

Спасибо! Эта функция была весьма полезна. Было бы полезно, чтобы у Pandas был встроен этот тип возможностей вместо того, чтобы просто бросать менее проницательную ошибку (или, по крайней мере, идентифицировать первую строку и столбец, в которых она столкнулась с проблемой). – murphsp1

1

не знаю, когда он будет выпущен, но вы можете попробовать с моим репозитария GitHub:

https://github.com/jtornero/pandas

Вы можете клонировать его и построить панд из источника; эта проблема практически решена, и она работает как

sampleList = ['Miño', '1', '2', 'señora'] 
dataframe = pandas.DataFrame(sampleList) 
ew = pandas.ExcelWriter('./test.xls', encoding='utf-8') 
dataframe.to_excel(ew) 
ew.save() 

Приветствиях

Jorge Tornero

4

На самом деле, есть способ заставить кодировку utf8 путем передачи параметра ExcelWriter:

ew = pandas.ExcelWriter('test.xlsx',options={'encoding':'utf-8'}) 
sampleList = ['Miño', '1', '2', 'señora'] 
dataframe = pandas.DataFrame(sampleList) 
dataframe.to_excel(ew) 
ew.save() 
+0

В '.to_csv' также используется необязательный параметр' encoding'. – notconfusing

11

В моем случае проблема состояла в том, что я был изначально , читал CSV-файл с неправильной кодировкой (ASCII вместо cp1252). Поэтому, когда pandas пытались записать его в файл Excel, он обнаружил некоторые символы, которые он не мог декодировать.

Я решил это, указав правильную кодировку при чтении CSV-файла.

data = pd.read_csv(fname, encoding='cp1252') 
2

Простейшая вещь - загрузить ваш dataframe в utf-8. Тогда ExcelWriter не спасет его.

data = pd.read_csv(path,encoding='utf-8') 
-1

я продолжал получать ту же ошибку, и из всех предложений, единственное, что работал для меня было:

data = pd.read_csv('Filename.csv', encoding='cp1252') 

Спасибо вам большое!

+0

Этот ответ был ранее указан, и ваш добавляет и ничего не изменяет из этого первоначального оператора. В будущем просто проголосуйте за ответ, который сработал для вас. –

+0

Я пока не могу голосовать, но я действительно оценил, что у кого-то есть единственный ответ, который работал на меня, поэтому я почувствовал необходимость сделать что-то вроде подтверждения их ответа. Как только у меня будет достаточно повторений, я продолжу. – Dpsmurphy

Смежные вопросы