2017-02-17 5 views
1

Я пытаюсь написать dataframe в электронную таблицу Excel, используя ExcelWriter, но он постоянно возвращается сообщение об ошибке:Как удалить недопустимые символы так dataframe могут писать Excel

openpyxl.utils.exceptions.IllegalCharacterError 

Я предполагаю, что есть какой-то символ в кадре данных, который ExcelWriter не нравится. Это кажется странным, потому что dataframe формируется из трех электронных таблиц Excel, поэтому я не вижу, как может быть символ, который не нравится Excel!

Есть ли способ выполнить итерацию с помощью фрейма данных и заменить символы, которые не нравится ExcelWriter? Я даже не возражаю, если он просто удалит их.

Каков наилучший способ или удаление или замена незаконных символов из фреймворка?

ответ

8

На основании ответа Haipeng Су, я добавил функцию, которая делает это:

dataframe = dataframe.applymap(lambda x: x.encode('unicode_escape'). 
       decode('utf-8') if isinstance(x, str) else x) 

В основном, это экранирует символы юникода, если они существуют. Это сработало, и теперь я могу писать в электронные таблицы Excel снова!

3

Я также боролся с некоторыми странными символами в кадре данных при записи фрейма данных в html или csv. Например, для символов с акцентом я не могу писать в html-файл, поэтому мне нужно преобразовать символы в символы без акцента.

Мой метод может быть не лучшим, но он помогает мне преобразовать unicode строку в ascii.

# install unidecode first 
from unidecode import unidecode 

def FormatString(s): 
if isinstance(s, unicode): 
    try: 
    s.encode('ascii') 
    return s 
    except: 
    return unidecode(s) 
else: 
    return s 

df2 = df1.applymap(FormatString) 

В вашей ситуации, если вы просто хотите, чтобы избавиться от недопустимых символов путем изменения return unidecode(s) в return 'StringYouWantToReplace'.

Надеюсь, что это может дать мне несколько идей для решения ваших проблем.

+0

Спасибо! Это было действительно полезно. Я использовал что-то подобное на основе вашей рекомендации. – user4896331

+0

Рад, что это помогает. – HaipengSu

2

попробуйте другой механизм чтения Excel, решил мою проблему.

writer = pd.ExcelWriter('file.xlsx', engine='xlsxwriter') 
+0

Кто-то написал «ES côté sick» в поле, которое возвращается в один из моих отчетов, и Python задыхался. Я сделал предложенное изменение, и он работал отлично. –

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