web-dev-qa-db-fra.com

Comment supprimer des caractères illégaux pour qu'une trame de données puisse écrire dans Excel

J'essaie d'écrire une trame de données dans une feuille de calcul Excel à l'aide d'ExcelWriter, mais elle continue de renvoyer une erreur:

openpyxl.utils.exceptions.IllegalCharacterError

Je suppose qu'il y a du caractère dans la trame de données qu'ExcelWriter n'aime pas. Cela semble étrange, car la trame de données est formée de trois feuilles de calcul Excel, donc je ne vois pas comment il pourrait y avoir un caractère qu'Excel n'aime pas!

Existe-t-il un moyen de parcourir une trame de données et de remplacer des caractères que ExcelWriter n'aime pas? Cela ne me dérange même pas s'il les supprime simplement.

Quelle est la meilleure façon de supprimer ou de remplacer des caractères illégaux dans une trame de données?

18
user4896331

Sur la base de la réponse de Haipeng Su, j'ai ajouté une fonction qui fait ceci:

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

Fondamentalement, il échappe aux caractères unicode s'ils existent. Cela a fonctionné et je peux à nouveau écrire dans des feuilles de calcul Excel!

28
user4896331

Le même problème m'est arrivé. Je l'ai résolu comme suit:

  1. install python package xlsxwriter:
pip install xlsxwriter
  1. remplacez le moteur par défaut 'openpyxl' par 'xlsxwriter':
dataframe.to_Excel("file.xlsx", engine='xlsxwriter')
12
mathsyouth

essayer un autre moteur d'écriture Excel a résolu mon problème.

writer = pd.ExcelWriter('file.xlsx', engine='xlsxwriter')
12
Jialin Zou

Je luttais également avec des caractères étranges dans un bloc de données lors de l'écriture du bloc de données en html ou csv. Par exemple, pour les caractères avec accent, je ne peux pas écrire dans un fichier html, j'ai donc besoin de convertir les caractères en caractères sans accent.

Ma méthode n'est peut-être pas la meilleure, mais elle m'aide à convertir unicode chaîne en ascii compatible.

# 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) 

Dans votre cas, si vous voulez simplement vous débarrasser des caractères illégaux en changeant return unidecode(s) en return 'StringYouWantToReplace'.

J'espère que cela peut me donner quelques idées pour résoudre vos problèmes.

5
Haipeng Su

Supprimez simplement les caractères illégaux de votre trame de données avant de les exporter dans 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()
0
miri

Si vous avez encore du mal à nettoyer les personnages, cela a bien fonctionné pour moi:

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()
0
REdim.Learning