2012-05-13 4 views
9

동일한 구조를 가진 여러 zip 파일이 있습니다. 루트 파일에는 XML 파일이 포함되어 있습니다. 각 zip 파일의 모든 파일은 고유합니다 (zip 파일 전체에 중복되지 않음). 모든 zip 파일의 모든 XML 파일을 하나의 zip 파일 (원래 zip 파일과 동일한 구조)에 결합해야합니다. 이 일을 가장 잘 수행 할 수있는 방법에 대한 제안? 감사.파이썬에서 여러 zip 파일을 하나의 zip 파일로 병합합니다.

+3

모두 압축을 풀고 새 것을 만드시겠습니까? – sarnold

+3

가장 확실한 방법이 될 것입니다. 또한 하나를 최종 zip 파일로 선택하고 다른 파일에서 파일을 추출하여 마지막 파일에 추가 할 수 있습니다. 그러나 더 빠를 것인지는 확실하지 않습니다. – jgritty

+0

@sarnold 감사합니다. 나도이 접근법을 생각하고 있었지만 더 우아한 방법이 있는지 확실하지 않았습니다. –

답변

11

이 내가 가지고 올 수있는 짧은 버전 : 대안을 테스트하지 않고

>>> import zipfile as z 
>>> z1 = z.ZipFile('z1.zip', 'a') 
>>> z2 = z.ZipFile('z2.zip', 'r') 
>>> z1.namelist() 
['a.xml', 'b.xml'] 
>>> z2.namelist() 
['c.xml', 'd.xml'] 
>>> [z1.writestr(t[0], t[1].read()) for t in ((n, z2.open(n)) for n in z2.namelist())] 
[None, None] 
>>> z1.namelist() 
['a.xml', 'b.xml', 'c.xml', 'd.xml'] 
>>> z1.close() 

, 나에게이 (너무 아마도 가장 눈에 띄는!) 최고 솔루션 때문에 - 모두 zip 파일을 가정하는 것이 포함되어 있습니다 같은 양의 데이터를 사용하는 경우이 방법을 사용하면 절반 만 압축 해제하고 다시 압축해야합니다 (1 파일).

추 신 : 목록 작성은 콘솔의 한 줄에 명령을 보관하면됩니다 (디버깅 속도가 빨라짐). 좋은 pythonic 코드는 for 루프가 필요합니다. 결과 목록은 아무런 도움이되지 않습니다.

HTH!

+0

감사합니다. 비록 다양한 수의 zip 파일을 갖게 될 것이므로보다 일반적인 접근 방식이 필요합니다. –

+1

@DaveCrumbacher : 내가 오해하지 않는 한, 하나 이상의 파일을 병합하는 데이 방법을 사용하려면 루프를 추가해야합니다. 'for zfile in (z2, z3, z4, ...)'... 또는 나는 무엇인가 놓치고 있냐? – mac

+0

예, @mac, 당신 말이 맞아요. 감사. –

6

@mac 덕분에 나왔습니다. 이것이 현재 구현 된 방식으로 첫 번째 zip 파일은 다른 zip 파일의 모든 파일을 포함하도록 수정됩니다.

import zipfile as z 

zips = ['z1.zip', 'z2.zip', 'z3.zip'] 

""" 
Open the first zip file as append and then read all 
subsequent zip files and append to the first one 
""" 
with z.ZipFile(zips[0], 'a') as z1: 
    for fname in zips[1:]: 
     zf = z.ZipFile(fname, 'r') 
     for n in zf.namelist(): 
      z1.writestr(n, zf.open(n).read()) 
+5

'zipfile.ZipFile()'은 컨텍스트 관리자이기도하므로'z1.close()'를'z.ZipFile (zips [0], 'a')로 바꿀 수 있습니다. 후속 코드. 독서 대상과 동일합니다. – glglgl

+2

감사합니다. @glglgl. 이 방법을 반영하기 위해 내 대답을 업데이트했습니다. –

관련 문제