Как определить двоичные и текстовые файлы с помощью Python? [дубликат]

C предназначен, чтобы быть шагом выше ассемблера. Оператор "if" C является действительно просто синтаксическим сахаром для "branch-if-zero", таким образом, идея булевских переменных как независимый тип данных была внешним понятием в то время. (1)

Даже сейчас, булевские переменные C/C++ обычно немного больше, чем псевдоним для единственного типа данных байта. По сути, это - действительно больше маркировки намерения, чем независимый тип данных.

(1), Конечно, современные компиляторы немного более совершенствуются в их обработке если операторы. Это с точки зрения C как новый язык.

16
задан Thomas 18 September 2009 в 20:04
поделиться

4 ответа

Спасибо всем, я нашел решение, подходящее для моей проблемы. Я нашел этот код на http://code.activestate.com/recipes/173220/ и изменил лишь небольшую часть, которая мне подходит.

Он отлично работает.

from __future__ import division
import string 

def istext(filename):
    s=open(filename).read(512)
    text_characters = "".join(map(chr, range(32, 127)) + list("\n\r\t\b"))
    _null_trans = string.maketrans("", "")
    if not s:
        # Empty files are considered text
        return True
    if "\0" in s:
        # Files with null bytes are likely binary
        return False
    # Get the non-text characters (maps a character to itself then
    # use the 'remove' option to get rid of the text characters.)
    t = s.translate(_null_trans, text_characters)
    # If more than 30% non-text characters, then
    # this is considered a binary file
    if float(len(t))/float(len(s)) > 0.30:
        return False
    return True
11
ответ дан 30 November 2019 в 21:11
поделиться

По своей сути не просто. Невозможно узнать наверняка, хотя в большинстве случаев вы можете сделать достаточно хорошее предположение.

Что вы можете сделать:

  • Ищите известные магические числа в двоичных подписях.
  • Ищите байт Unicode- отметка порядка в начале файла
  • Если файл регулярно имеет размер 00 xx 00 xx 00 xx (для произвольного xx) или наоборот, это вполне возможно UTF-16
  • В противном случае ищите в файле нули; файл с 0 в вряд ли будет текстовым файлом с однобайтовой кодировкой.

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

8
ответ дан 30 November 2019 в 21:11
поделиться

Если ваш скрипт работает на * nix, вы можете использовать что-то вроде этого:

import subprocess
import re

def is_text(fn):
    msg = subprocess.Popen(["file", fn], stdout=subprocess.PIPE).communicate()[0]
    return re.search('text', msg) != None
4
ответ дан 30 November 2019 в 21:11
поделиться

Можно было бы использовать libmagic , чтобы угадать MIME-тип файла с помощью python-magic . Если вы вернете что-то в пространстве имен "text / *" , это, скорее всего, текстовый файл, а все остальное, скорее всего, двоичный файл .

5
ответ дан 30 November 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: