Что такое все ILLEGAL_CHARACTERS из openpyxl? - PullRequest
0 голосов
/ 20 июня 2020

Мы столкнулись с проблемой при разборе писем с python из Outlook. Иногда в электронных письмах есть символы, которые нельзя добавить на лист Excel с помощью openpyxl. Ошибка, которую он вызывает, - это просто IllegalCharacterError.

Я пытаюсь заставить это распечатать фактические символы, которые считаются «незаконными».

Это сказано, пока вы копались в одном из файлы в opnepyxl, которые я нашел на cell.py, эта строка вызывает ошибку.

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 Ответ

1 голос
/ 20 июня 2020

В регулярном выражении или для краткости Regex вывод, который вы видите, является выражением определенных символов в заданном диапазоне. Например:

Первая часть RE:

[\000-\010]

Это означает, что этот набор содержит любой символ от 0 до 8 (коды символов от 0 до 8), который управляющие символы. Вы можете получить любой символ от NULL (�) до BS (backspace).

Вторая часть RE:

[\013-\014]

Опять же, это больше управляющих символов. В частности, символы с 11 по 12 (код символа с 11 по 12). Это может быть VT или FF . Обратите внимание, что VT на самом деле является таблицей, которую нельзя распечатать.

Третья часть RE:

[\016-\037]

Теперь это немного интереснее, так как оно содержит как управляющие символы, , так и печатные символы . Таким образом, с учетом сказанного вы можете ожидать получить любой символ от 14 до 31 (код символа от 14 до 31).

Итак, единственная логическая причина, по которой он не может печатать какие-либо недопустимые символы, заключается в том, что предоставленный RE просто не влечет за собой печатаемых символов. Любой символ ASCII после 33 - это печатный символ (32 - пробел) , но, как вы можете видеть здесь, ваш код принимает все от \ 000 до \ 037. Итак, вы пытаетесь напечатать управляющие символы, которые нельзя распечатать.

Вот таблица ASCII для справки: https://www.w3schools.com/charsets/ref_html_ascii.asp

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...