Python, file (1) – Почему числа и диапазон (0x20, 0x100) используются для определения текстового или двоичного файла

Что касается решения для определения, является ли файл двоичным или текстовым в python , то ответчик использует:

textchars = bytearray([7,8,9,10,12,13,27]) + bytearray(range(0x20, 0x100)) 

а затем использует .translate(None, textchars) для удаления (или замены ничем) всех таких символов в файле .translate(None, textchars) двоичным.

Ответчик также утверждает, что этот выбор чисел «основан на действии файла (1)» (для текста, а что нет). Что так важно в этих числах, это определение текстовых файлов из двоичных файлов?

One Solution collect form web for “Python, file (1) – Почему числа и диапазон (0x20, 0x100) используются для определения текстового или двоичного файла”

Они представляют собой наиболее распространенные кодовые страницы для печатаемого текста, плюс новые строки, пробелы и возврат каретки и тому подобное. ASCII покрывается до 0x7F, а такие стандарты, как Latin-1 или Windows Codepage 1251, используют оставшиеся 128 байт для акцентированных символов и т. Д.

Вы ожидаете, что текст будет использовать только эти кодовые точки. Двоичные данные будут использовать все кодовые точки в диапазоне 0x00-0xFF; например, текстовый файл, вероятно, не будет использовать \ x00 (NUL) или \ x1F (Unit Separator в стандарте ASCII).

В лучшем случае это эвристика. Некоторые текстовые файлы могут по-прежнему пытаться использовать коды управления C0 вне этих 7 символов, явно названных, и я уверен, что существуют двоичные данные, которые не включают 25 байтовых значений, не включенных в строку textchars .

Автор диапазона, вероятно, основывал его на таблице text_chars из команды file . Он помечает байты как нетекстовые, ASCII, латинские-1 или нешифовальные ASCII и включает документацию о том, почему именно эти кодовые точки выбраны:

 /* * This table reflects a particular philosophy about what constitutes * "text," and there is room for disagreement about it. * * [....] * * The table below considers a file to be ASCII if all of its characters * are either ASCII printing characters (again, according to the X3.4 * standard, not isascii()) or any of the following controls: bell, * backspace, tab, line feed, form feed, carriage return, esc, nextline. * * I include bell because some programs (particularly shell scripts) * use it literally, even though it is rare in normal text. I exclude * vertical tab because it never seems to be used in real text. I also * include, with hesitation, the X3.64/ECMA-43 control nextline (0x85), * because that's what the dd EBCDIC->ASCII table maps the EBCDIC newline * character to. It might be more appropriate to include it in the 8859 * set instead of the ASCII set, but it's got to be included in *something* * we recognize or EBCDIC files aren't going to be considered textual. * * [.....] */ 

Интересно, что в этой таблице нет 0x7F, которую не нашел код, который вы нашли.

  • «Unicode Error» unicodeescape »кодек не может декодировать байты ... Не удается открыть текстовые файлы в Python 3
  • как получить символы юникода в URL-адресе django?
  • Кодировка Python для pipe.communicate
  • Двойной декодирование юникода в python
  • Я смущен этим кодом
  • Является ли Python 3.3 лучше, чем 2,7 для декодирования и повторного кодирования Скребковый веб-текст для UTF-8? Как, намного лучше?
  • Соответствие букв на любом языке
  • Проверка python, если строка utf-8 в верхнем регистре
  • Преобразование unicode с помощью строки utf-8 в качестве содержимого для str
  • Установить кодировку в сценариях Python 3 CGI
  • Unicode или что в matplotlib?
  • Python - лучший язык программирования в мире.