كيفية التعرف على الملفات الثنائية والنصية باستخدام بايثون؟[ينسخ]
سؤال
هذا السؤال لديه بالفعل إجابة هنا:
أحتاج إلى تحديد أي ملف يكون الثنائية والذي هو نص في دليل.
حاولت استخدام أنواع mimetypes لكنها ليست فكرة جيدة في حالتي لأنها لا تستطيع التعرف على جميع ملفات التمثيل الصامت، ولدي غرباء هنا ...أنا فقط بحاجة إلى معرفة، ثنائي أو نص.بسيط ؟لكني لم أجد الحل..
شكرًا
المحلول
شكرا للجميع، لقد وجدت الحل الذي يناسب مشكلتي.لقد وجدت هذا الرمز في 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
نصائح أخرى
انها بطبيعتها لا بسيط.لا توجد طريقة لمعرفة ذلك على وجه اليقين، على الرغم من أنه يمكنك اتخاذ تخمين جيد إلى حد معقول في معظم الحالات.
الأشياء التي قد ترغب في القيام بها:
- ابحث عن الأرقام السحرية المعروفة في التوقيعات الثنائية
- ابحث عن علامة ترتيب البايت Unicode في بداية الملف
- إذا كان الملف بانتظام 00 xx 00 xx 00 xx (لـ xx التعسفي) أو العكس، فمن المحتمل أن يكون UTF-16
- بخلاف ذلك، ابحث عن 0s في الملف؛الملف الذي يحتوي على 0 in هو من غير المرجح ليكون ملف نصي ترميز بايت واحد.
لكن الأمر كله مجرد إرشادي - فمن الممكن جدًا أن يكون لديك ملفًا عبارة عن ملف نصي صالح و ملف صورة صالح، على سبيل المثال.من المحتمل أن يكون هراء كملف نصي، ولكنه مشروع في بعض الترميزات أو غيرها...
قد يكون من الممكن استخدامها libmagic لتخمين نوع MIME للملف باستخدام بيثون السحر.إذا رجعت شيئا في "نص/*" مساحة الاسم، فمن المحتمل أن يكون ملفًا نصيًا، بينما من المحتمل أن يكون أي شيء آخر ملفًا ملف ثنائي.
إذا كان البرنامج النصي الخاص بك يعمل على *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