পাইথনে এক্সটেনশন ছাড়াই কীভাবে ফাইল টাইপ করবেন?


87

আমার কাছে ফাইলগুলি পূর্ণ ফোল্ডার রয়েছে এবং তাদের কোনও এক্সটেনশন নেই। আমি কীভাবে ফাইলের প্রকার পরীক্ষা করতে পারি? আমি ফাইলের প্রকারটি পরীক্ষা করতে এবং সেই অনুসারে ফাইলের নামটি পরিবর্তন করতে চাই। আসুন একটি ফাংশন অনুমান filetype(x)মত একটি ফাইল টাইপ ফেরৎ png। আমি এটা করতে চাই:

files = os.listdir(".")
for f in files:
    os.rename(f, f+filetype(f))

আমি এটা কিভাবে করবো?



আপনার সম্পর্কে আরও সুনির্দিষ্ট হতে হবে file types। আপনি কি এটি জিআইএফ, পিএনজি, বিএমপি বা জেপিজি নির্ধারণ করছেন? আপনি কি কেবল এটি টেক্সট / বাইনারি জানতে চান? কার্যকর?
জোফিশ

@ thg435, একবার আপনি মাইমে টাইপ করলে এটিকে কোনও উপযুক্ত ফাইলনাম এক্সটেনশনে রূপান্তর করার উপায় আছে?
মার্ক রান্সম

@ মার্ক: হ্যাঁ, অনুমান_ এক্সটেনশন ব্যবহার করুন , তবে আসলে মাইমটাইপগুলি এখানে কাজ করবে না, কারণ এটি ফাইল এক্সটেনশনের উপর ভিত্তি করে। তাদের যা প্রয়োজন তা লিবারমজিক (লিঙ্কের ২ য় উত্তর দেখুন)।
জর্জি

4
এই pypi.org/project/filetype চেষ্টা ?
zx1986

উত্তর:


92

পাইথন লাইব্রেরি রয়েছে যা তাদের সামগ্রীর উপর ভিত্তি করে ফাইলগুলি সনাক্ত করতে পারে (সাধারণত একটি শিরোনাম / যাদু নম্বর) এবং যা ফাইলের নাম বা এক্সটেনশনের উপর নির্ভর করে না।

আপনি যদি বিভিন্ন ফাইলের প্রকারের ঠিকানা দিচ্ছেন তবে আপনি এটি ব্যবহার করতে পারেন python-magic। এটি সু-প্রতিষ্ঠিত magicগ্রন্থাগারের জন্য কেবল একটি পাইথন বাঁধাই । এটির সীমাবদ্ধ ব্যবহারে এটির একটি ভাল খ্যাতি রয়েছে এবং (ছোট প্রস্তাবনা) রয়েছে, এটি দৃ been় হয়েছে।

আরও বিশেষায়িত ফাইল ধরণের লাইব্রেরি রয়েছে। উদাহরণস্বরূপ, পাইথন স্ট্যান্ডার্ড লাইব্রেরিতে imghdrমডিউল রয়েছে যা কেবল চিত্র ফাইলের জন্য একই কাজ করে।

আপনার যদি নির্ভরতা-মুক্ত (খাঁটি পাইথন) ফাইলের ধরণের পরীক্ষার প্রয়োজন হয় তবে দেখুন filetype


4
প্যাকেজটি python-magic-win64উইন্ডোজে আমার জন্য কাজ করেছে
চেশুআরসি

4
imgdr ফাইল টাইপের সংমিশ্রণে উইন্ডোতে আমার জন্য কাজ করেছেন
হৃশিকেশ ধুমাল

62

পাইথন ম্যাজিক গ্রন্থাগার কার্যকারিতা আপনার যা দরকার প্রদান করে।

আপনি এটি সহ গ্রন্থাগারটি ইনস্টল করতে pip install python-magicএবং এটি ব্যবহার করতে পারেন:

>>> import magic

>>> magic.from_file('iceland.jpg')
'JPEG image data, JFIF standard 1.01'

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

>>> magic.from_file('greenland.png')
'PNG image data, 600 x 1000, 8-bit colormap, non-interlaced'

>>> magic.from_file('greenland.png', mime=True)
'image/png'

এক্ষেত্রে পাইথন কোডটি হুডের নীচে লিবারমজিকের দিকে আহ্বান জানায় যা * NIX fileকমান্ড দ্বারা ব্যবহৃত একই লাইব্রেরি । সুতরাং, এটি সাবপ্রসেস / শেল-ভিত্তিক উত্তরগুলির মতো একই কাজ করে তবে ওভারহেড ছাড়াই।


6
সাবধান যে পাইথন-ম্যাজিক নামে ডিবান / উবুন্টু প্যাকেজ একই নামের পাইপ প্যাকেজের চেয়ে আলাদা। উভয়ই import magicকিন্তু অসামঞ্জস্য সামগ্রী রয়েছে। আরও জানতে স্ট্যাকওভারফ্লো . com/a/16203777/3189 দেখুন।
হামিশ ডাউনার

4
@ রিচার্ড আপনার কি ওভারহেড দিকটি বিশদভাবে বলতে চান? python-magicসাবপ্রসেস পন্থাগুলি ব্যবহার করে লাইব্রেরিটি কী আরও দক্ষ করে তোলে ?
গ্রেগ

9

ইউনিক্স এবং লিনাক্সে fileফাইলের ধরণের অনুমান করার কমান্ড রয়েছে। এমনকি একটি উইন্ডোজ পোর্ট আছে

থেকে man পৃষ্ঠা :

ফাইল প্রতিটি তর্ককে শ্রেণিবদ্ধ করার প্রয়াসে পরীক্ষা করে। এই ক্রমে তিনটি পরীক্ষার সেট করা হয়: ফাইল সিস্টেম পরীক্ষা, যাদু নম্বর পরীক্ষা এবং ভাষা পরীক্ষা। প্রথম পরীক্ষাটি সফল হয় যার ফলে ফাইল প্রকারটি মুদ্রিত হয়।

আপনাকে মডিউলটি fileদিয়ে কমান্ডটি চালাতে হবে subprocessএবং তারপরে কোনও এক্সটেনশান বের করার জন্য ফলাফলগুলি পার্স করতে হবে।

সম্পাদনা: আমার উত্তর উপেক্ষা করুন। পরিবর্তে ক্রিস জনসনের উত্তর ব্যবহার করুন।


+1 আমি বুঝতে fileপারিনি যে এত কিছু করে। # file arc.gif arc.gif: GIF image data, version 89a, 234 x 269
জোফিশ

ঠিক আছে, আমি আশা করছিলাম কারও কাছে এর থেকে ভাল উত্তর হবে। ওপিতে এখনও অনেক কাজ বাকি আছে, এটি কোনও সাধারণ ফাংশন কল নয়।
স্টিভেন রাম্বালস্কি

4
+1 fileকমান্ডটি ব্যবহার করে একটি সুবিধা হ'ল এটি লিনাক্স ডিস্ট্রিবিউশনগুলিতে নেটিভ হয় তবে এটি ব্যবহৃত python-magicহয় না এবং এটি ব্যবহারের আগে ডাউনলোড করে ইনস্টল করতে হয়। মডিউলটি ব্যবহার করে স্ক্রিপ্টটি বহনযোগ্য বলে মনে করা হচ্ছে এটি কিছুটা সমস্যা।
হ্যালো গুডবাই


6

আপনি fileপাইথনের অফিশিয়াল বাইন্ডিং ইনস্টল করতে পারেন , এটি একটি লাইব্রেরি file-magic(এটি সিটিপস ব্যবহার করে না, যেমন python-magic)।

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


6
import subprocess
p = sub.Popen('file yourfile.txt', stdout=sub.PIPE, stderr=sub.PIPE)
output, errors = p.communicate()
print(output)

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


এবং আপনি কিভাবে আউটপুট ক্যাপচার করবেন?
মার্ক রান্সম

@ মার্করানসোম দুঃখিত যে এটি একটি ভাল উপায় ছিল না, দয়া করে উপরে আমার আপডেটগুলি দেখুন
xvatar

পাইথন লাইব্রেরি ব্যবহার না করে যদি আপনার সিস্টেমে ইন্টারঅ্যাক্ট করার দরকার হয় তবে সমাধানটি বেশিরভাগ সময় সাবপটিমাল হয় কারণ এটি সম্ভবত অন্য একটি এপিআই সহ অন্যান্য অপারেটিং সিস্টেমে কার্যকর নয়।
এরিকবওয়ার্ক

4

নতুন সাবপ্রসেস লাইব্রেরির সাহায্যে আপনি এখন নিম্নলিখিত কোডটি ব্যবহার করতে পারেন (* নিক্স কেবলমাত্র সমাধান):

import subprocess
import shlex

filename = 'your_file'
cmd = shlex.split('file --mime-type {0}'.format(filename))
result = subprocess.check_output(cmd)
mime_type = result.split()[-1]
print mime_type

উত্তর করার জন্য ধন্যবাদ. বিটিডাব্লু, আপনার কোনও সেন্টিমিডি লাইনে স্ট্রিংস্প্লিট () ব্যবহার করা উচিত নয়। shlex.split (সেমিডি) insteed ব্যবহার করুন।
শ্রদ্ধেয়

ব্যবহারের পরিবর্তে shlex.split, কেন শুধু চালাবেন না subprocess.check_output(['file', '--mime-type', filename])?
ফ্লিম

1

এছাড়াও আপনি এই কোডটি ব্যবহার করতে পারেন (খাঁটি পাইথনটি 3 বাইট দ্বারা শিরোলেখের ফাইলটি):

full_path = os.path.join(MEDIA_ROOT, pathfile)

try:
    image_data = open(full_path, "rb").read()
except IOError:
    return "Incorrect Request :( !!!"

header_byte = image_data[0:3].encode("hex").lower()

if header_byte == '474946':
    return "image/gif"
elif header_byte == '89504e':
    return "image/png"
elif header_byte == 'ffd8ff':
    return "image/jpeg"
else:
    return "binary file"

কোনও প্যাকেজ ইনস্টল না করে [এবং আপডেট সংস্করণ]


আমি কীভাবে এক্সএলএসএক্স পরীক্ষা করতে পারি?
হর্ষ বিয়ানি

আপনি 4 বা 8 বাইট ব্যবহার করতে পারেন। এক্সএলএসএক্স (এমএস অফিস ওপেন এক্সএমএল ফর্ম্যাট ডকুমেন্ট) => 50 4 বি 03 04 (4 বাইট) => এএসসিআইআই (পিকে ••) বা এক্সএলএসএক্স (এমএস অফিস 2007 নথি) => 50 4 বি 03 04 14 06 06 00 (8 বাইট) = > এএসসিআইআই (পিকে ••••••)
চিরসবুজ

0

শুধুমাত্র লিনাক্সের জন্য কাজ করে তবে "sh" পাইথন মডিউলটি ব্যবহার করে আপনি যে কোনও শেল কমান্ড কল করতে পারেন

https://pypi.org/project/sh/

পাইপ ইনস্টল sh

আমদানি করা sh

sh.file ("/ রুট / ফাইল")

আউটপুট: / মূল / ফাইল: ASCII পাঠ্য

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.