2010-09-13 11 views
20

मेरे पास एक पायथन प्रोग्राम है जो इनपुट फ़ाइलों को इनपुट के रूप में ले जा रहा है। हालांकि, इनमें से कुछ फ़ाइलें gzip संपीड़ित हो सकती हैं।कैसे बताना है कि फ़ाइल gzip संपीड़ित है या नहीं?

क्या कोई क्रॉस-प्लेटफ़ॉर्म है, जो कि पाइथन से उपयोग करने योग्य है यह निर्धारित करने के लिए कि कोई फ़ाइल gzip संपीड़ित है या नहीं?

क्या निम्न विश्वसनीय है या एक सामान्य पाठ फ़ाइल 'गलती से' gzip- जैसे झूठी सकारात्मक पाने के लिए पर्याप्त है?

try: 
    gzip.GzipFile(filename, 'r') 
    # compressed 
    # ... 
except: 
    # not compressed 
    # ... 
+1

बस एक छोटा संकेत ... फ़ाइल समाप्त होने पर कभी भरोसा न करें। इसे कैसे करें इसके लिए हॉप का उत्तर देखें। – helpermethod

+0

@ हेल्पर: मुझे यकीन नहीं है (मेरा संपादन देखें)। आपको अभी भी एक संभावित IOError से निपटना होगा, लेकिन प्रत्यय के बिना gzipped फ़ाइलों को तोड़ दिया गया है, मेरी राय में ... कठिन कॉल :) – hop

उत्तर

34

magic number gzip संकुचित फ़ाइलों के लिए 1f 8b है। हालांकि इसके लिए परीक्षण 100% विश्वसनीय नहीं है, लेकिन यह बहुत ही असंभव है कि "सामान्य पाठ फ़ाइलें" उन दो बाइट्स से शुरू होती हैं- यूटीएफ -8 में यह कानूनी भी नहीं है।

आमतौर पर gzip संपीड़ित फाइलें प्रत्यय .gz खेलती हैं। यहां तक ​​कि gzip(1) स्वयं बिना फ़ाइलों को अनपैक नहीं करेगा जबतक कि आप --force तक नहीं। आप कल्पनापूर्वक इसका उपयोग कर सकते हैं, लेकिन आपको अभी भी एक संभावित IOError (जिसे आपको किसी भी मामले में करना है) से निपटना होगा।

आपके दृष्टिकोण के साथ एक समस्या यह है कि gzip.GzipFile() अपवाद नहीं फेंक देगा अगर आप इसे एक असम्पीडित फ़ाइल खिलाते हैं। केवल बाद में read() होगा। इसका मतलब है कि आपको शायद अपने कुछ प्रोग्राम तर्क को दो बार लागू करना होगा। बदसूरत।

+0

gzip संपीड़ित फ़ाइलों में अक्सर .gz फ़ाइल एक्सटेंशन होता है (वास्तव में, मुझे नहीं लगता कि मैं कभी भी एक .gzip एक्सटेंशन देखा है), लेकिन फ़ाइल प्रकार के किसी भी तरह परीक्षण करने के लिए फ़ाइल एक्सटेंशन पर भरोसा करना आम तौर पर असुरक्षित है। – CanSpice

+0

@ कानस्पिस: बेशक, टाइपो – hop

+0

क्या यह है? - gzip सी लाइब्रेरी पारदर्शी रूप से असम्पीडित फ़ाइलों को पढ़ेगी।हालांकि यह असम्पीडित फ़ाइलों को लिख देगा, लेकिन यह "gzip -t" (मुझे एक बार पकड़ा गया) की अनुमति देने के लिए सीआरसी कोड डालता है –

0

mimetypes मॉड्यूल आयात करें। यह स्वचालित रूप से अनुमान लगा सकता है कि आपके पास किस प्रकार की फ़ाइल है, और यदि यह संपीड़ित है।

यानी

mimetypes.guess_type('blabla.txt.gz') 

रिटर्न:

('पाठ/सादे', 'gzip')

+12

'mimetypes' केवल फ़ाइल नाम के अंत की जांच करता है, यह वास्तव में फ़ाइल की सामग्री के आधार पर अनुमान नहीं लगाता है। – Odinulf

0

python3 में अच्छी तरह से काम करने के लिए ... लगता नहीं है

import mimetypes 
filename = "./datasets/test" 

def file_type(filename): 
    type = mimetypes.guess_type(filename) 
    return type 
print(file_type(filename)) 

रिटर्न (कोई नहीं, कोई नहीं) लेकिन यूनिक्स कमांड से "फ़ाइल"

: ~> फ़ाइल डेटासेट/परीक्षण डेटासेट/परीक्षण: एक पार मंच गुरु जनवरी 29 07:09:34 2015

+3

mimetypes प्रकार का अनुमान लगाने के लिए फ़ाइल नाम को juts का उपयोग करता है। कच्ची फ़ाइल से फ़ाइल टाइप का पता लगाने के लिए आपको 'जादू' मॉड्यूल का उपयोग करने की आवश्यकता होगी। –

2

"वहाँ है: gzip संकुचित डेटा, था" iostat_collection ", यूनिक्स से, अंतिम बार संशोधित , पाइथन मार्ग से प्रयोग करने योग्य यह निर्धारित करने के लिए कि क्या फ़ाइल gzip संपीड़ित है या नहीं? "

स्वीकृत उत्तर मुझे विश्वसनीय विश्वसनीय समाधान के रास्ते का 9 0% रास्ता मिला (परीक्षण अगर पहले दो बाइट 1f 8b हैं), लेकिन यह नहीं दिखाया कि वास्तव में पाइथन में इसे कैसे किया जाए। यहां एक संभावित तरीका है:

import binascii 

def is_gz_file(filepath): 
    with open(filepath, 'rb') as test_f: 
     return binascii.hexlify(test_f.read(2)) == b'1f8b' 
संबंधित मुद्दे