ExcelWriterを使用してExcelスプレッドシートにデータフレームを書き込もうとしていますが、エラーが返され続けます。
openpyxl.utils.exceptions.IllegalCharacterError
ExcelWriterが気に入らないデータフレームの一部の文字があると思います。データフレームは3つのExcelスプレッドシートから形成されているため、奇妙に思われるため、Excelが気に入らない文字があるかどうかはわかりません。
データフレームを反復処理し、ExcelWriterが気に入らない文字を置き換える方法はありますか?単に削除するだけでも構いません。
データフレームから不正な文字を削除または置き換える最良の方法は何ですか?
Haipeng Suの回答に基づいて、私はこれを行う関数を追加しました:
dataframe = dataframe.applymap(lambda x: x.encode('unicode_escape').
decode('utf-8') if isinstance(x, str) else x)
基本的に、Unicode文字が存在する場合は、それをエスケープします。問題なく動作し、Excelスプレッドシートに再び書き込むことができます!
同じ問題が私にも起こりました。私はそれを次のように解決しました:
pip install xlsxwriter
dataframe.to_Excel("file.xlsx", engine='xlsxwriter')
別のExcelライターエンジンを試すと、問題が解決しました。
writer = pd.ExcelWriter('file.xlsx', engine='xlsxwriter')
また、データフレームを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'
_に変更して、不正な文字を単に削除したい場合。
これがあなたの問題に対処するためのいくつかのアイデアを与えてくれることを願っています。
Excelにエクスポートする前に、データフレームから不正な文字を削除するだけです。
import pandas as pd
import re
import openpyxl
from openpyxl.cell.cell import ILLEGAL_CHARACTERS_RE
writer = pd.ExcelWriter(myexcelfilepath, engine='openpyxl')
# [optional] avoid pandas.DataFrame.to_Excel overwritting your existing workbook
workbook = openpyxl.load_workbook(myexcelfilepath)
writer.book = workbook
# replace illegal characters in str or unicode value by ''
# using the regex ILLEGAL_CHARACTERS_RE string defined in openpyxl.cell.cell module
mydataframe = mydataframe.applymap(
lambda x: re.sub(ILLEGAL_CHARACTERS_RE, '', x)
if isinstance(x, str) or isinstance(x, unicode) else x)
# export your cleaned dataframe to Excel
mydataframe.to_Excel(writer, sheet_name='targetsheetname', index=False)
writer.close()
それでもキャラクターのクリーンアップに苦労している場合、これは私にとってうまくいきました:
import xlwings as xw
import pandas as pd
df = pd.read_pickle('C:\\Users\\User1\\picked_DataFrame_notWriting.df')
topath = 'C:\\Users\\User1\\tryAgain.xlsx'
wb = xw.Book(topath)
ws = wb.sheets['Data']
ws.range('A1').options(index=False).value = df
wb.save()
wb.close()