كيفية التعرف على الملفات الثنائية والنصية باستخدام بايثون؟[ينسخ]

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

  •  22-07-2019
  •  | 
  •  

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

أحتاج إلى تحديد أي ملف يكون الثنائية والذي هو نص في دليل.

حاولت استخدام أنواع 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top