Как идентифицировать двоичные и текстовые файлы с помощью Python? [дубликат]
этот вопрос уже есть ответ здесь:
Мне нужно определить, какие и бинарные и текст в каталоге.
Я пробовал использовать mimetypes но это это не очень хорошая идея в моем случае, потому что она не может идентифицировать все файлы мимы, и у меня есть незнакомые здесь... Мне просто нужно знать, двоичный или текстовый. Просто ? Но я не мог найти решение...
спасибо
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 "" 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
Это по своей сути не простой. Нет способа узнать наверняка, хотя в большинстве случаев вы можете сделать достаточно хорошее предположение.
вещей, которые вы могли бы сделать:
- ищите известные магические числа в двоичных сигнатурах
- найдите метку порядка байтов Unicode в начале файла
- если файл регулярно 00 xx 00 xx 00 xx (для произвольного xx) или наоборот, это вполне возможно UTF-16
- в противном случае найдите 0s в файле; файл с 0 в вряд ли быть текстовым файлом с однобайтовой кодировкой.
но это все эвристика - вполне возможно иметь файл, который является допустимым текстовым файлом и допустимый файл изображения, например. Вероятно, это было бы глупо как текстовый файл, но законно в какой-то кодировке или другом...
Если ваш скрипт работает на *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
можно использовать libmagic угадать тип MIME файла с помощью python-magic. Если вы получите обратно что-то в "текст/*" пространство имен, скорее всего, текстовый файл, в то время как все остальное, скорее всего,двоичный файл.