2015-05-18 4 views
16

पहचान नहीं करता है पाइथन tarfile लाइब्रेरी टूटा हुआ टैर नहीं ढूंढती है।tar.extractall() अप्रत्याशित ईओएफ

[email protected]$ wc -c good.tar 
143360 good.tar 

[email protected]$ head -c 130000 good.tar > cut.tar 

[email protected]$ tar -tf cut.tar 
... 
tar: Unexpected EOF in archive 
tar: Error is not recoverable: exiting now 

बहुत अच्छा, कमांड लाइन उपकरण एक अप्रत्याशित ईओएफ को पहचानता है।

[email protected]$ python 
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
>>> import tarfile 
>>> tar=tarfile.open('cut.tar') 
>>> tar.extractall() 

अच्छा नहीं है। पायथन पुस्तकालय फ़ाइल को डीकोड करता है, लेकिन कोई अपवाद नहीं उठाता है।

पायथन पुस्तकालय के साथ अप्रत्याशित ईओएफ का पता लगाने के लिए कैसे? मैं subprocess मॉड्यूल से बचना चाहता हूं।

पैरामीटर errorlevel मदद नहीं करता है। मैंने errorlevel = 1 और errorlevel = 2 की कोशिश की।

+0

अच्छी पकड़! आपको एक बग रिपोर्ट खोलने पर विचार करना चाहिए और अपना समाधान – knitti

+0

@knitti सबमिट करना चाहिए मैंने एक बग रिपोर्ट खोली: http://bugs.python.org/issue24259 – guettli

+0

दुख की बात है कि मैं किसी मौजूदा व्यक्ति को कुछ बक्षीस नहीं जोड़ सकता ... – knitti

उत्तर

6

मैंने एक काम लिखा था। यह मेरी टैर फाइलों के साथ काम करता है। मुझे लगता है कि यह सभी प्रकार की वस्तुओं का समर्थन नहीं करता है जिन्हें एक टैर फ़ाइल में संग्रहीत किया जा सकता है।

# -*- coding: utf-8 -*- 
from __future__ import absolute_import, division, unicode_literals, print_function 
import os 
import tarfile 

class TarfileWhichRaisesOnEOF(tarfile.TarFile): 
    def extractall(self, path=".", members=None): 
     super(TarfileWhichRaisesOnEOF, self).extractall(path, members) 
     if members is None: 
      members = self 

     for tarinfo in members: 
      if not tarinfo.isfile(): 
       continue 
      file=os.path.join(path, tarinfo.name) 
      size_real=os.path.getsize(file) 
      if size_real!=tarinfo.size: 
       raise tarfile.ExtractError('Extracting %s: Size does not match. According to tarinfo %s and on disk %s' % (
        tarinfo, tarinfo.size, size_real)) 
1

यह अजगर 3 में तय किया गया है - एक OSErrorerrorlevel सेटिंग कुछ भी हो बढ़ाई जाती है।

+0

क्षमा करें, मेरे मामले में त्रुटि गलती काम नहीं करता है। इसका मतलब है कि Python3 परिवर्तन यहां मदद नहीं करेगा। – guettli

+0

@guettli: आपने 3.4 के साथ प्रयास किया? कृपया http://bugs.python.org/issue24259 ऐसा कहकर एक नोट जोड़ें। –

+0

मैंने पायथन 3.4.0 के साथ अपलोड tar_which_is_cut.tar extractall() को निकालने का प्रयास किया। यह एक ओएसईआरर - अच्छा उठाता है। केवल 2.7 प्रभावित? – guettli

संबंधित मुद्दे