2013-04-25 2 views
1

나는 아래 코드를 사용하여 매일 생성되는 백업 파일을 압축합니다.어떻게 파일을 파이썬에 추가 할 수 있습니까?

import os, zipfile 

zf = zipfile.ZipFile("Test.zip", "w") 
for root, subdirs, files in os.walk("C:/Users/Bob/Desktop/Zip"): 
    for filename in files: 
     zf.write(os.path.join(root, filename)) 
zf.close() 

문제는 파일을 여는 경로의 모든 폴더가 zip을 열 때 발생한다는 것입니다. 예를 들어, 우편 번호 안에는 Users/Bob/Desktop/Zip/File.gdb라는 폴더가 있습니다.

그러나 나는 zip 안에 File.gdb 만 원합니다. 그 이유는 모든 폴더를 포함 할 때 실제로 파일을 압축하지 않기 때문입니다. 지퍼 안쪽에있을 때와 같은 크기입니다. 그러나 File.gdb 만 압축하면 30MB에서 3MB로 줄어 듭니다.

도움을 주시면 감사하겠습니다.

+0

? 그들은 전적으로 관련이 없습니다. –

답변

2

당신은 arcname parameter of ZipFile.write 볼 필요가 :

ZipFile.write(filename[, arcname[, compress_type]])

이 그것을 기본적으로 아카이브 이름 arcname을 (제공 아카이브에 filename라는 이름의 파일, 쓰기,이 filename과 동일합니다 드라이브 문자가없고 경로 구분 기호가 제거되지 않은 경우). 귀하의 경우에는

, 당신이 가장 가능성이 원하는 : 당신은 파일 이름이나 압축에 대해 묻는

zf.write(os.path.join(root, filename), filename, zipfile.ZIP_DEFLATED) 
+0

감사합니다. 그게 효과가 있었지만, 어떤 이유로 폴더를 오른쪽 클릭하고 Windows를 통해 우편 전송할 때처럼 실제로 파일을 압축하지 않습니다. 내가 왜 압축을 못하는지 알기나 해? – ianbroad

+1

경로명은 압축과 관련이 없습니다. 당신이 그것을 요구하지 않기 때문에 당신은 압축을 얻지 못하고 있습니다. 'zf.write (os.path.join (루트, 파일 이름), 압축 형식 = ZipFile.ZIP_DEFLATED) '또는'zf.write (os.path.join (root, filename), 파일 이름, ZipFile.ZIP_DEFFLATED)'를 시도하십시오. –

+0

감사합니다. Zipfile.ZIP_DEFLATED는 소문자 Z가 있어야하므로 zipfile.ZIP_DEFLATED를 사용해야합니다. – ianbroad

관련 문제