python যবহ কিভাবে পাইথন একটি ফাইল mime টাইপ খুঁজে?




বাংলায় পাইথন (13)

বলুন আপনি কোথাও ফাইলগুলির একটি গুচ্ছ সংরক্ষণ করতে চান, উদাহরণস্বরূপ BLOB তে। ধরুন আপনি এই ফাইলগুলিকে একটি ওয়েব পৃষ্ঠার মাধ্যমে ডিশ করতে চান এবং ক্লায়েন্ট স্বয়ংক্রিয়ভাবে সঠিক অ্যাপ্লিকেশন / ভিউয়ার খুলতে চান।

ধারণা: HTTP প্রতিক্রিয়াতে মাইম-টাইপ (সামগ্রী-টাইপ?) শিরোনাম দ্বারা কোন অ্যাপ্লিকেশন / ভিউয়ার ব্যবহার করতে ব্রাউজার সনাক্ত করে।

সেই অনুমানের উপর ভিত্তি করে, ফাইলের বাইটের পাশাপাশি, আপনি MIME টাইপ সংরক্ষণ করতে চান।

কিভাবে আপনি একটি ফাইলের MIME টাইপ খুঁজে পাবেন? আমি বর্তমানে ম্যাকের উপর আছি, তবে উইন্ডোজ এও এটি কাজ করবে।

ওয়েব পেজে ফাইল পোস্ট করার সময় ব্রাউজার এই তথ্য যোগ করে?

এই তথ্য খোঁজার জন্য একটি নিখুঁত পাইথন লাইব্রেরি আছে? একটি ওয়েবসেবার বা (এমনকি ভাল) একটি ডাউনলোডযোগ্য ডাটাবেস?


আপনি imghdr পাইথন মডিউল ব্যবহার করতে পারেন।


2017 আপডেট

গিথুবে যেতে হবে না, এটি পিপিপিতে ভিন্ন নামের অধীনে রয়েছে:

pip3 install --user python-magic
# or:
sudo apt install python3-magic  # Ubuntu distro package

কোড পাশাপাশি সরলীকৃত করা যাবে:

>>> import magic

>>> magic.from_file('/tmp/img_3304.jpg', mime=True)
'image/jpeg'

মিমিটাইপ মডিউল ফাইল এক্সটেনশনের উপর ভিত্তি করে একটি ফাইল টাইপ সনাক্ত করে। যদি আপনি এক্সটেনশান ছাড়াই একটি ফাইলের ফাইলের ফাইল পুনরুদ্ধার করার চেষ্টা করবেন, তবে মিমিটপগুলি কাজ করবে না।



পাইপন-ম্যাজিক প্যাকেজটি ব্যবহার করার জন্য মিমিটিপ লাইব্রেরি ব্যবহার করার চেয়ে আরও নির্ভরযোগ্য উপায়।

import magic
m = magic.open(magic.MAGIC_MIME)
m.load()
m.file("/tmp/document.pdf")

এই ফাইল (1) ব্যবহার সমতুল্য হবে।

Django এও এটি নিশ্চিত করতে পারে যে MIME টাইপ UploadedFile.content_type এর সাথে মিলে যায়।


3 টি বিভিন্ন লাইব্রেরি যা libmagic wraps আছে।

তাদের মধ্যে 2 পাইপিতে উপলব্ধ (তাই পিপ ইনস্টল কাজ করবে):

  • filemagic
  • পাইথন-জাদু

এবং অন্যটি, পাইথন-যাদুের মতোই সরাসরি সর্বশেষ libmagic উত্সগুলিতে পাওয়া যায় এবং সম্ভবত আপনার লিনাক্স বিতরণে এটি একটি।

ডেবিয়ানের প্যাকেজ পাইথন-ম্যাজিক এই সম্পর্কেই এবং এটি টিভোটুও হিসাবে ব্যবহৃত হয় এবং সাইমন জিমমারম্যান বলেছেন (IMHO) হিসাবে এটি অপঠিত হয় না।

আমার মনে হয় অন্য একটি গ্রহণ (libmagic মূল লেখক দ্বারা)।

খুব খারাপ পিপিআই সরাসরি পাওয়া যায় না।


আমি অনেক উদাহরণ চেষ্টা করেছি কিন্তু Django mutagen চমত্কারভাবে খেলে।

উদাহরণ যদি ফাইল mp3 হয় চেক

from mutagen.mp3 import MP3, HeaderNotFoundError  

try:
    audio = MP3(file)
except HeaderNotFoundError:
    raise ValidationError('This file should be mp3')

নেতিবাচক দিক হচ্ছে ফাইল ফাইলগুলি পরীক্ষা করার জন্য আপনার সীমাবদ্ধতা সীমিত, তবে আপনি যদি কেবল ফাইল টাইপটি পরীক্ষা করতে চান তবে অতিরিক্ত তথ্য অ্যাক্সেস করতে চান তবে এটি দুর্দান্ত উপায়।


আপনি কোন ওয়েব সার্ভারটি ব্যবহার করছেন তা আপনি উল্লেখ করেন নি, তবে অ্যাপাচিটি ম্যাম যাদু নামে পরিচিত একটি সুন্দর সামান্য মডিউল যা এটি করার সময় এটির একটি ফাইলের ধরন নির্ধারণ করার জন্য ব্যবহার করে। এটি ফাইলের কিছু সামগ্রী পড়ে এবং এটি সনাক্ত করার চেষ্টা করে যে এটি কী অক্ষরগুলির উপর ভিত্তি করে পাওয়া যায়। এবং ডেভ ওয়েব উল্লেখ করেছেন যে মাইট টাইপস মডিউলটি পাইথনের অধীনে কাজ করবে, তবে একটি এক্সটেনশান সহজেই কাজ করবে।

বিকল্পভাবে, যদি আপনি একটি ইউনিক্স বক্সে বসে থাকেন তবে আপনি sys.popen('file -i ' + fileName, mode='r') ব্যবহার করতে পারেন MIME টাইপটি ধরতে। উইন্ডোজ একটি সমান কমান্ড থাকা উচিত, কিন্তু আমি এটা কি তা নিশ্চিত না।


এই খুব সহজ মনে হচ্ছে

>>> from mimetypes import MimeTypes
>>> import urllib 
>>> mime = MimeTypes()
>>> url = urllib.pathname2url('Upload.xml')
>>> mime_type = mime.guess_type(url)
>>> print mime_type
('application/xml', None)

ওল্ড পোস্ট পড়ুন দয়া করে


পাইথন bindings libmagic

এই বিষয়ে সকল ভিন্ন উত্তর খুব বিভ্রান্তিকর, তাই আমি libmagic এর বিভিন্ন বাঁধনের এই সংক্ষিপ্ত বিবরণ সহ আরও কিছু স্বচ্ছতা দেওয়ার আশা করছি। পূর্বে mammadori উপলব্ধ অপশন তালিকাভুক্ত একটি সংক্ষিপ্ত উত্তর দিয়েছেন।

libmagic

ফাইলগুলি মাইম-টাইপ নির্ধারণ করার সময়, পছন্দের সরঞ্জামটি কেবল file বলা হয় এবং এর ব্যাক- libmagic বলা libmagic । ( darwinsys.com/file ।) প্রকল্পটি একটি ব্যক্তিগত সিভিএস-সংগ্রহস্থলের মধ্যে উন্নত করা হয়েছে, তবে জিথব-এ কেবল একটি পঠনযোগ্য গিট মিরর রয়েছে

এখন এই টুলটি, যদি আপনি পাইথনের সাথে যে কোনও লিবম্যাগিক বাইন্ডিং ব্যবহার করতে চান তবে এটি ইতিমধ্যেই আপনার নিজস্ব পাইথন বাইন্ডিংগুলির সাথে file-magic নামে পরিচিত। তাদের জন্য অনেক ডেডিকেটেড ডকুমেন্টেশন নেই, তবে আপনি সি-লাইব্রেরির ম্যান পৃষ্ঠাতে একবার নজর রাখতে পারেন: man libmagic । মূল ব্যবহারটি https://github.com/file/file/tree/master/python বর্ণিত হয়েছে:

import magic

detected = magic.detect_from_filename('magic.py')
print 'Detected MIME type: {}'.format(detected.mime_type)
print 'Detected encoding: {}'.format(detected.encoding)
print 'Detected file type name: {}'.format(detected.name)

এছাড়া, উদাহরণস্বরূপ ফাইলের মধ্যে magic.open(flags) ব্যবহার করে আপনি একটি Magic বস্তু তৈরি করে লাইব্রেরীটি ব্যবহার করতে পারেন।

toivotuo এবং ewr2san উভয় file টুল file-magic অন্তর্ভুক্ত এই file-magic বাইন্ডিং ব্যবহার করে। তারা ভুলভাবে অনুমান করে, তারা python-magic প্যাকেজ ব্যবহার করছে। এটি ইঙ্গিত দেয় যে, যদি file এবং python-magic উভয় ইনস্টল করা হয়, তবে পাইথন মডিউল ম্যাজিকটি পূর্বের দিকে নির্দেশ করে।

পাইথন-জাদু

এই গ্রন্থাগারটি সাইমন জিমমারম্যান তার উত্তর সম্পর্কে আলোচনা করেছেন এবং এটি ক্লড কুমোমের পাশাপাশি গ্রিংগো সুভ দ্বারা নিযুক্ত করা হয়।

filemagic

দ্রষ্টব্য : ২013 সালে সর্বশেষ এই প্রকল্পটি আপডেট করা হয়েছিল!

একই সি-এপিআই ভিত্তিক থাকার কারণে, এই লাইব্রেরিতে libmagic file-magic সহ কিছু সাদৃশ্য রয়েছে। এটি শুধুমাত্র mammadori দ্বারা উল্লেখ করা হয় এবং অন্য কোন উত্তর এটি নিয়োগ।


স্ট্যান্ডার্ড লাইব্রেরিতে মিক্টিপেস মডিউল ফাইল এক্সটেনশন থেকে MIME টাইপ নির্ধারণ / অনুমান করবে।

ব্যবহারকারীদের ফাইল আপলোড করা হয়, HTTP পোস্ট তথ্য বরাবর ফাইলের MIME টাইপ থাকবে। উদাহরণস্বরূপ, Django এই তথ্যটিকে UploadedFile ফাইলের অ্যাট্রিবিউট হিসাবে উপলব্ধ করে।


পাইথন 3.x এবং ফাইলটিতে url সহ ওয়েবপ্যাপ যা এক্সটেনশান বা একটি জাল এক্সটেনশান থাকতে পারে না। আপনি ব্যবহার করে পাইথন-যাদু ইনস্টল করা উচিত

pip3 install python-magic

ম্যাক ওএস এক্স এর জন্য, আপনি ব্যবহার করে libmagic ইনস্টল করা উচিত

brew install libmagic

টুকিটাকি সংকেতলিপি

import urllib
import magic
from urllib.request import urlopen

url = "http://...url to the file ..."
request = urllib.request.Request(url)
response = urlopen(request)
mime_type = magic.from_buffer(response.readline())
print(mime_type)

বিকল্পভাবে আপনি পড়া আকারে রাখতে পারে

import urllib
import magic
from urllib.request import urlopen

url = "http://...url to the file ..."
request = urllib.request.Request(url)
response = urlopen(request)
mime_type = magic.from_buffer(response.read(128))
print(mime_type)

@ টিভোটুওর পদ্ধতিটি পাইথন 3 এর অধীনে আমার জন্য সবচেয়ে ভাল এবং সবচেয়ে নির্ভরযোগ্যভাবে কাজ করেছে। আমার লক্ষ্য ছিল জিএসপিড ফাইল সনাক্ত করা যা কোন নির্ভরযোগ্য .gz এক্সটেনশান নেই। আমি পাইথন 3 জাদু ইনস্টল।

import magic

filename = "./datasets/test"

def file_mime_type(filename):
    m = magic.open(magic.MAGIC_MIME)
    m.load()
    return(m.file(filename))

print(file_mime_type(filename))

এটি একটি gzipped ফাইলের জন্য: অ্যাপ্লিকেশন / gzip; অক্ষরসেট = বাইনারি

একটি unzipped txt ফাইল (iostat তথ্য) জন্য: টেক্সট / প্লেইন; charset = US-ASCII

একটি tar ফাইলের জন্য: অ্যাপ্লিকেশন / এক্স-টার; অক্ষরসেট = বাইনারি

একটি bz2 ফাইলের জন্য: অ্যাপ্লিকেশন / এক্স-বিজিপ 2; অক্ষরসেট = বাইনারি

এবং শেষ কিন্তু অন্তত আমার জন্য একটি। জিপিপি ফাইল: অ্যাপ্লিকেশন / জিপ; অক্ষরসেট = বাইনারি





mime