2015-05-18 25 views
16

Thư viện Python tarfile không phát hiện thấy tar bị hỏng.tar.extractall() không nhận ra EOF bất ngờ

[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 

Rất đẹp, công cụ dòng lệnh nhận ra EOF không mong muốn.

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

Không đẹp. Thư viện Python giải mã tập tin, nhưng không có ngoại lệ.

Cách phát hiện EOF không mong muốn bằng thư viện Python? Tôi muốn tránh mô-đun subprocess.

Tham số errorlevel không có tác dụng. Tôi đã thử errorlevel = 1 và errorlevel = 2.

+0

thú vị! bạn nên xem xét việc mở một báo cáo lỗi và gửi giải pháp của bạn – knitti

+0

@knitti Tôi đã mở một báo cáo lỗi: http://bugs.python.org/issue24259 – guettli

+0

Đáng buồn là tôi không thể thêm một số tiền thưởng vào một cái hiện có ... – knitti

Trả lời

6

Tôi đã viết một tác phẩm xung quanh. Nó hoạt động với các tập tin tar của tôi. Tôi đoán nó hỗ trợ không phải tất cả các loại đối tượng có thể được lưu trữ trong một tập tin tar.

# -*- 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

này đã được cố định bằng Python 3 - một OSError được nâng lên không phụ thuộc vào thiết lập errorlevel.

+0

Xin lỗi, trong trường hợp của tôi, thiết lập errorlevel không hoạt động. Điều này có nghĩa là những thay đổi Python3 sẽ không giúp ích gì ở đây. – guettli

+0

@guettli: bạn đã thử với 3,4? Vui lòng thêm ghi chú vào http://bugs.python.org/issue24259 để nói như vậy. –

+0

Tôi đã cố gắng extractall() tar_which_is_cut.tar đã tải lên bằng Python 3.4.0. Nó làm tăng một OSError - tốt. Chỉ 2,7 bị ảnh hưởng? – guettli

Các vấn đề liên quan