如何删除非法字符以便数据框可以写入 Excel

How to remove illegal characters so a dataframe can write to Excel

我正在尝试使用 ExcelWriter 将数据帧写入 Excel 电子表格,但它一直返回错误:

openpyxl.utils.exceptions.IllegalCharacterError

我猜 ExcelWriter 不喜欢数据框中的某些字符。这看起来很奇怪,因为数据框是由三个 Excel 电子表格组成的,所以我看不出怎么会有 Excel 不喜欢的字符!

有什么方法可以遍历数据框并替换 ExcelWriter 不喜欢的字符?我什至不介意它只是删除它们。

从数据框中删除或替换非法字符的最佳方法是什么?

在将数据框写入 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' 来摆脱非法字符。

希望这能给我一些想法来处理你的问题。

根据苏海鹏的回答,我添加了一个功能:

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

基本上,它会转义 unicode 字符(如果存在)。它奏效了,我现在可以再次写入 Excel 电子表格!

尝试不同的 excel 编写器引擎解决了我的问题。

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

如果您仍在努力清理字符,这对我来说效果很好:

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

我也遇到了同样的问题。我是这样解决的:

  1. 安装 python 包 xlsxwriter:
pip install xlsxwriter
  1. 将默认引擎 'openpyxl' 替换为 'xlsxwriter':
dataframe.to_excel("file.xlsx", engine='xlsxwriter')

如果您不想安装另一个 Excel 编写器引擎(例如 xlsxwriter),您可以尝试通过查找导致 IllegalCharacterError 错误的模式来删除这些非法字符提出。

打开在/path/to/your/python/site-packages/openpyxl/cell/找到的cell.py,寻找check_string函数,你会看到它使用定义的正则表达式模式ILLEGAL_CHARACTERS_RE来找到那些非法字符。试图找到它的定义你会看到这一行:

ILLEGAL_CHARACTERS_RE = re.compile(r'[[=15=]0-0]|[3-4]|[6-7]')

这一行是您需要删除的那些字符。将此行复制到您的程序并在将数据帧写入 Excel:

之前执行以下代码

dataframe = dataframe.applymap(lambda x: ILLEGAL_CHARACTERS_RE.sub(r'', x) if isinstance(x, str) else x)

以上行将删除每个单元格中的那些字符。


但是这些字符的来源可能是个问题。如您所说,数据框来自三个 Excel 电子表格。如果源 Excel 电子表格包含这些字符,您仍然会遇到此问题。因此,如果您可以控制源电子表格的生成过程,请尝试从那里删除这些字符。

您可以对 python 个字符串使用内置的 strip() 方法。

每个单元格:

text = str(illegal_text).strip()

对于整个数据框:

dataframe = dataframe.applymap(lambda t: str(t).strip())