如何删除非法字符以便数据框可以写入 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()
我也遇到了同样的问题。我是这样解决的:
- 安装 python 包 xlsxwriter:
pip install xlsxwriter
- 将默认引擎 '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())
我正在尝试使用 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()
我也遇到了同样的问题。我是这样解决的:
- 安装 python 包 xlsxwriter:
pip install xlsxwriter
- 将默认引擎 '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())