디렉토리에 백 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
안녕하세요! 귀하의 제안에 감사드립니다. 정말 대단한 일이지만, 제 코드에서는 스레드가 파일을 블로킹하여 종료 할 때까지 그것을 풀고 동시에 읽어야하기 때문에 제 경우에는 작동하지 않을 것이라고 생각합니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까? –
for 루프 이후의 모든 것을'run' 메소드에 추가 할 수 있습니까? 어떻게 작동하는지보고 나면 다시 테스트 해 볼 수 있습니다. – bbayles