पायथन लिपि में टार फाइल कंटेंट को बिना पढ़े, बिना पढ़े


82

मेरे पास एक टार फाइल है, जिसके भीतर कई फाइलें हैं। मुझे एक पाइथन स्क्रिप्ट लिखने की ज़रूरत है, जो फाइलों की सामग्री को पढ़ेगी और कुल ओ अक्षरों को बताएगी, जिसमें टार फाइल को अनट्रेस किए बिना अक्षरों की कुल संख्या, स्पेस, न्यूलाइन वर्ण, सब कुछ शामिल है।


आप वर्ण / अक्षर / रिक्त स्थान को कैसे गिन सकते हैं?
आप

16
ठीक यही सवाल पूछा गया है।
एरिक कपलुन

जवाबों:


127

आप उपयोग कर सकते हैं getmembers()

>>> import  tarfile
>>> tar = tarfile.open("test.tar")
>>> tar.getmembers()

उसके बाद, आप extractfile()फ़ाइल ऑब्जेक्ट के रूप में सदस्यों को निकालने के लिए उपयोग कर सकते हैं । बस एक उदाहरण है

import tarfile,os
import sys
os.chdir("/tmp/foo")
tar = tarfile.open("test.tar")
for member in tar.getmembers():
    f=tar.extractfile(member)
    content=f.read()
    print "%s has %d newlines" %(member, content.count("\n"))
    print "%s has %d spaces" % (member,content.count(" "))
    print "%s has %d characters" % (member, len(content))
    sys.exit()
tar.close()

fउपरोक्त उदाहरण में फ़ाइल ऑब्जेक्ट के साथ , आप उपयोग कर सकते हैं read(), readlines()आदि।


17
"में सदस्य के लिए tar.getmembers ()" को "tar में सदस्य के लिए" में परिवर्तित किया जा सकता है जो कि एक जनरेटर या एक iterator (मुझे यकीन नहीं है कि कौन सा है)। लेकिन यह एक बार में एक सदस्य हो जाता है।
हगी

2
मुझे बस इसी तरह की समस्या थी, लेकिन टारफाइल मॉड्यूल मेरे राम को खाने के लिए लगता है, भले ही मैंने 'r|'विकल्प का उपयोग किया हो ।
देवसंड

2
आह। मैंने इसे हल किया। यह मानते हुए कि आप कोड को हग्गी द्वारा इंगित करेंगे, आपको सदस्यों की सूची को एक बार में "साफ" करना होगा। तो ऊपर दिए गए कोड का उदाहरण, यह होगा tar.members = []। यहाँ अधिक जानकारी: bit.ly/JKXrg6
devsnd

लूप tar.getmembers()में डालने पर कई बार कहा जाएगा for member in tar.getmembers()?
झांग

1
"F = tar.extractfile (सदस्य)" करने के बाद, क्या आपको भी f बंद करने की आवश्यकता है?
बोलेई

12

आपको टर्फाइल मॉड्यूल का उपयोग करने की आवश्यकता है। विशेष रूप से, आप फ़ाइल तक पहुँचने के लिए वर्ग TarFile का एक उदाहरण का उपयोग करते हैं, और फिर TarFile.getSames () के साथ नामों का उपयोग करते हैं

 |  getnames(self)
 |      Return the members of the archive as a list of their names. It has
 |      the same order as the list returned by getmembers().

यदि इसके बजाय आप सामग्री पढ़ना चाहते हैं , तो आप इस विधि का उपयोग करें

 |  extractfile(self, member)
 |      Extract a member from the archive as a file object. `member' may be
 |      a filename or a TarInfo object. If `member' is a regular file, a
 |      file-like object is returned. If `member' is a link, a file-like
 |      object is constructed from the link's target. If `member' is none of
 |      the above, None is returned.
 |      The file-like object is read-only and provides the following
 |      methods: read(), readline(), readlines(), seek() and tell()

ध्यान दें, आप सदस्य का निर्माण कर सकते हैं जैसे कि एक सूचकांक के माध्यम से निर्मितmyFile = myArchive.extractfile( dict(zip(myArchive.getnames(), myArchive.getmembers()))['path/to/file'] ).read()
ThorSummoner

5

@ Stefano-borini द्वारा बताई गई विधियों का कार्यान्वयन टार अभिलेखागार के सदस्य को फ़ाइल नाम के माध्यम से एक्सेस करना चाहिए

#python3
myFile = myArchive.extractfile( 
    dict(zip(
        myArchive.getnames(), 
        myArchive.getmembers()
    ))['path/to/file'] 
).read()`

क्रेडिट:


0

आप tarfile.list () पूर्व का उपयोग कर सकते हैं:

filename = "abc.tar.bz2"
with open( filename , mode='r:bz2') as f1:
    print(f1.list())

इन आंकड़ों को प्राप्त करने के बाद। आप इस आउटपुट को फ़ाइल या अपनी आवश्यकता के अनुसार करने के लिए हेरफेर या लिख ​​सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.