openpyxl 中的所有 ILLEGAL_CHARACTERS 是啥?

Posted

技术标签:

【中文标题】openpyxl 中的所有 ILLEGAL_CHARACTERS 是啥?【英文标题】:What are all the ILLEGAL_CHARACTERS from openpyxl?openpyxl 中的所有 ILLEGAL_CHARACTERS 是什么? 【发布时间】:2020-10-10 05:19:35 【问题描述】:

在 Outlook 中使用 python 解析电子邮件时遇到问题。有时电子邮件包含无法使用 openpyxl 附加到 Excel 工作表的字符。它引发的错误只是IllegalCharacterError

我试图强制它打印出被认为是“非法”的实际字符。

也就是说,在我在cell.py 上发现的 opnepyxl 中的一个文件中进行一些挖掘时,该行会引发错误。

if next(ILLEGAL_CHARACTERS_RE.finditer(value), None):
    raise IllegalCharacterError

因此导航到定义ILLEGAL_CHARACTERS_RE 的位置,我们发现:

ILLEGAL_CHARACTERS_RE = re.compile(r'[\000-\010]|[\013-\014]|[\016-\037]')

所以我尝试print(ILLEGAL_CHARACTERS_RE),希望它能打印出它所代表的值。由于我对正则表达式或编译的使用不是很熟练,我不确定会发生什么,但遗憾的是我打印到控制台的结果是re.compile(r'[\000-\010]|[\013-\014]|[\016-\037]')

谁能帮我弄清楚如何打印这些值,或者至少了解如何找到这些值代表什么?

【问题讨论】:

【参考方案1】:

在正则表达式或简称正则表达式中,您看到的输出是给定范围内某些字符的表达式。例如:

RE 的第一部分:

[\000-\010]

这意味着该集合包含从 0 到 8 的任何字符(字符代码 0 到 8),它们是控制字符。您可以得到从 NULL (�) 到 BS(退格)的任何字符。

RE 的第二部分:

[\013-\014]

同样,这是更多的控制字符。具体来说,从 11 到 12 的字符(字符代码 11 到 12)。可以来自 VTFF。请注意,VT 实际上是无法打印的表格。

RE第三部分:

[\016-\037]

现在这更有趣了,因为它包含控制字符以及可打印字符。话虽如此,您可以期望得到 14 到 31 之间的任何字符(字符代码 14 到 31)。

所以它不能打印任何非法字符的唯一合乎逻辑的原因是因为提供的 RE 根本不包含可打印字符。 33 之后的任何 ASCII 字符都是可打印字符 (32 是空格字符),但正如您在此处看到的,您的代码包含从 \000 到 \037 的所有内容。因此,您正在尝试打印不可打印的控制字符。

这是一个 ASCII 表供参考: https://www.w3schools.com/charsets/ref_html_ascii.asp

我希望这会有所帮助!

【讨论】:

其实你可以打印它们。他们只是打印为正方形。我已经想出了如何通过编写字节字符串并对其进行解码来打印它们。我认为解决方案是转换我从电子邮件正文中获得的字符串,然后将其转换为字节,然后根据 openpyxl 用空格或其他东西替换任何“非法”的字节码。我确实觉得很奇怪 openpyxl 认为 33 到 37 是非法的。这些是可打印的,我一直在移动它们,所以我发现它在正则表达式中有点奇怪。 在我星期一回去工作之前无法测试。感谢您提供详细信息和参考链接。 没问题!我希望我确实对您的问题有所了解。 这是我用来至少解码字节码并打印可以打印的内容。 x = b'\000\010\013\014\016\017\018\019\020\021\022\023\024\025\026\027\028\029\030\031\032\033\034\035\036\037' print(x.decode())

以上是关于openpyxl 中的所有 ILLEGAL_CHARACTERS 是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用openpyxl删除excel中的第一行

openpyxl数据存储

用python将两个excel文件中的所有工作表复制到一个新的excel?

如何使用 Python 读取包含扩展字体的 Excel 文件? (openpyxl 错误:最大值为 14)

使用python内置模块os和openpyxl搜索指定文件夹下Excel中的内容

如何使用`openpyxl`库在Excel中的合并单元格中写入?