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

StackOverflow https://stackoverflow.com/questions/1446549

  •  22-07-2019
  •  | 
  •  

Вопрос

На этот вопрос уже есть ответ здесь:

мне нужно определить какой файл является двоичный и что такое текст в каталоге.

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

Спасибо

Это было полезно?

Решение

Спасибо всем, я нашел решение, которое подходит для моей проблемы.Я нашел этот код на 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

Другие советы

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

Что вам может понравиться:

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

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

Возможно, можно будет использовать библиотека libmagic чтобы угадать MIME-тип файла, используя Python-магия.Если вы вернете что-то в "текст/*" пространство имен, скорее всего, это текстовый файл, а все остальное, скорее всего, бинарный файл.

Если ваш скрипт работает на *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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top