2017-01-03 1 views
2

python zipfile 모듈을 사용하여 폴더의 모든 파일을 압축하려고합니다 (폴더에 하위 디렉토리가 없음). 그러나 원하는 출력을 얻을 수 없습니다.Python - zipfile 모듈을 사용하여 디렉토리의 모든 파일 압축

folderAF:\Projects\ProjectA\Folders\folderA and my script under F:\Projects\ProjectA\CodeA\zipcode.py입니다. 결과 zip 파일의 이름이 folderA.zip이고 F:\Projects\ProjectA\Folders이며 원본 파일 이름이되도록 folderA의 모든 파일을 압축하려고합니다.

유일한 문제는 결과를 압축 해제하면 folderA 대신 Folders \ folderA가 생성된다는 것입니다. 스크립트에 folderA의 상대 경로와 관련이 있지만 원하는 결과를 얻지 못하는 것 같습니다. 루프에서

#zipcode.py 
import os 
import zipfile 

filepath = "F:/Projects/ProjectA/Folders/folderA" 

archive = zipfile.ZipFile(os.path.abspath(filepath) + '.zip', 'w') 

for root, dirs, files in os.walk(filepath): 
     for afile in files: 
      archive.write(os.path.relpath(os.path.join(root, afile))) 
     archive.close() 

답변

0

arcname 매개 변수를 사용하여 아카이브 멤버의 이름을 변경 :

archive.write(os.path.join(root, afile),arcname=name_in_archive) 

경우

name_in_archive = os.path.join(os.path.basename(filepath),afile) 

folderA 경로를 보존 할 수 있습니다.

한 가지 확실하지 않은 점은 (파이썬의 버전에 따라) 슬래시로 windows 백 슬래시를 대체해야 할 수 있다는 것입니다. 따라서 .zip 파일은 이식 가능합니다. 다치게하지 않는다 : 나는 os.path.relpath 호출, 우리는 아카이브 파일의 이름을 완벽하게 제어 할 수 있기 때문에 지금이 필요 하락했다

archive.write(os.path.join(root, afile),arcname=name_in_archive.replace(os.sep,"/")) 

참고.

또한 아카이브를 열 때 절대 경로로 변환 할 필요가 없습니다. 그것은 절대 것처럼뿐만 아니라 상대의 경우 open 파일을 찾습니다

archive = zipfile.ZipFile(os.path.abspath(filepath) + '.zip', 'w') 

단지

archive = zipfile.ZipFile(filepath + '.zip', 'w') 
+0

가 실제로 모든 파일이 거주와 폴 데라라는 이름의 폴더를 포함하는 출력 zip 파일을 원하는 작성할 수 있습니다 그 안에. 위 파일은 zip 파일에 직접 파일을 씁니다. –

+0

@Riz_K : 첫 번째 대답은 true이지만 edit는'name_in_archive = os.path.join (os.path.basename (filepath), afile)'을 추가했습니다. 이렇게하면 모든 파일에'folderA' 접두사가 추가됩니다. 중요한 점은 아카이브에있는 파일의 이름을 제어하는 ​​방법을 알고 있다는 것입니다. –

+0

굉장 ... 세부 감사드립니다! –

관련 문제