2013-07-28 2 views
0

디렉토리에 백 zip 파일이 있으므로 모든 파일의 압축을 풀기 위해 python 스크립트를 만들었지 만 모든 파일의 백분율 상태를 큰 zipfile 안에 표시해야했습니다. 실제로 각 zip 파일에는 하나의 파일 만 있습니다.파이썬에서 zip 파일 추출 (백분율 표시) 모니터링

여기에 몇 가지 예가 있지만 각 zipfile에는 여러 개의 파일이 있으므로 zipfile 안에있는 파일의 수는 대략 백분율입니다 (내 사례).

그래서, 아래의 코드를 작성하지만 각 ZipFile를 위해 난 그냥 "완료 100 %"하지만 각 파일에 대해 보여주는한다 그런 걸 보여주고 있어요 :

10 % 완료 12 % 완료를 16 % 완료 ... 100 % 완료

정말 고맙겠습니다.

# -- coding: utf-8 -- 

import glob, zipfile, sys, threading 
from os.path import getsize 

class Extract(threading.Thread): 
     def __init__(self, z, fname, base, lock): 
      threading.Thread.__init__(self) 
      self.z = z 
      self.fname = fname 
      self.base = base 
      self.lock = lock 

     def run(self): 
      self.lock.acquire() 
      self.z.extract(self.fname, self.base) 
      self.lock.release() 

if len(sys.argv) < 2: 
    sys.exit(""" 
Sintaxe : python %s [Nome da Pasta] 
""" % sys.argv[0]) 

base = sys.argv[1] 
if base[len(base)-1:] != '/': 
    base += '/' 

for fs in glob.glob(base + '*.zip'): 
    if 'BR' not in fs.split('.'): 
     f = open(fs,'rb') 
     z = zipfile.ZipFile(f) 
     for fname in z.namelist(): 
      size = [s.file_size for s in z.infolist() if s.filename == fname][0] 
      lock = threading.Lock() 
      background = Extract(z, fname, base, lock) 
      background.start() 
      print fname + ' => ' + str(size) 
      while True: 
       lock.acquire() 
       filesize = getsize(base + fname) 
       lock.release() 
       print "%s %% completed\r" % str(filesize * 100.0/size) 
       if filesize == size: 
        break 

답변

0

디스크에 직접 쓰기. 괜찮아. 근데 너는 그것에 매달리고 싶어. extract을 사용하는 대신 open을 사용할 수 있습니다. open을 사용하면 파일과 유사한 객체를 가져올 수 있으며, 디스크에서 파일을 복사하여 진행 상황을 기록 할 수 있습니다.

0

다음은 코드를 수정하는 데 사용할 수있는 코드 조각입니다. ZipInfo object을 사용하여 구성원 파일의 압축되지 않은 크기를 찾습니다. 그것을 읽으면서 당신이 얼마나 가까이 다가 왔는지보고 할 수 있습니다.

이것은 Python 3.2 이상에서 작성된 것입니다. 그런 다음 with 명령문 지원이 추가되었습니다. 이전 버전에서는 zip 파일을 열고 수동으로 닫아야합니다.

from zipfile import ZipFile 

chunk_size = 1024 * 1024 
zip_path = "test_zip.zip" 
with ZipFile(zip_path, 'r') as infile: 
    for member_info in infile.infolist(): 
     filename = member_info.filename 
     file_size = member_info.file_size 
     with open("{}_{}".format(zip_path, filename), 'wb') as outfile: 
      member_fd = infile.open(filename) 
      total_bytes = 0 
      while 1: 
       x = member_fd.read(chunk_size) 
       if not x: 
        break 
       total_bytes +=outfile.write(x) 
       print("{0}% completed".format(100 * total_bytes/file_size)) 
+0

안녕하세요! 귀하의 제안에 감사드립니다. 정말 대단한 일이지만, 제 코드에서는 스레드가 파일을 블로킹하여 종료 할 때까지 그것을 풀고 동시에 읽어야하기 때문에 제 경우에는 작동하지 않을 것이라고 생각합니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까? –

+0

for 루프 이후의 모든 것을'run' 메소드에 추가 할 수 있습니까? 어떻게 작동하는지보고 나면 다시 테스트 해 볼 수 있습니다. – bbayles

관련 문제