2017-02-22 2 views
1

사용자 지정 폴더를 사용자 지정 위치에 zip 파일로 백업하는 스크립트를 만들었으므로 한 번만 스크립트를 실행할 수 있지만 스크립트를 다시 실행하고 zip 파일 이름과 동일한 인수를 사용하면 아래 오류를 얻으십시오. 아래이미 파이썬으로 닫혀있는 zip 아카이브를 어떻게 얻을 수 있습니까?

Attempt to write to ZIP archive that was already closed 

Zip 파일의 코드 :

bkZip = zipfile.ZipFile(backZip, 'w') # Not sure what to say for lines 26 - 31 
for dirname, subdirs, files in os.walk(backUp): 
    bkZip.write(dirname) 
    for filename in files: 
     bkZip.write(os.path.join(dirname, filename)) 
    bkZip.close() 

나는이 문제를 해결하고 약간의 도움을 필요로하는 방법을 전혀 모르겠어요.

+2

은'bkZip.close()'가 최상위 레벨 루프 안에 들여 쓰기로되어 있다고 생각합니까? 그건 분명히 틀린 것 같지만, 실제 코드에서 문제의 원인이 아닌 Stack Overflow 에디터에 코드를 복사 한 결과 일 수 있습니다. 그 라인이 실제로 그렇게된다면,'backUp' 위치에 서브 폴더가있을 때 (스크립트를 몇 번이나 실행했는지에 상관없이) 여러분의 백업이 실패 할 것으로 기대합니다. – Blckknght

답변

1

에 출력이 시도 :

for dirname, subdirs, files in os.walk(backUp): 
    bkZip.write(dirname) 
    for filename in files: 
     bkZip.write(os.path.join(dirname, filename)) 
bkZip.close() 
+0

은 단지 "파일이 이미 오류가 존재하는"고정있어 감사 과의 문제는 최대 'ZipFile를 같은 내 폴더를 백업 : // 홈/아 케노/데스크탑/부트 스트랩 /' 대신 'ZipFile에의 : // 부트 스트랩 /' – TheCryptek

1

정확하게 원하는 일에 달려 있습니다.

대상 파일 이름의 파일이 이미 (my_zip_file.zip.old, 말), 다음 이름을 변경 존재 여부를 확인하거나 삭제할 수 :

if os.path.exists(foo): 
    os.remove(foo) 

를 아니면 경고를 인쇄 할 수 있으며, 사용자에게 기존 아카이브를 삭제하거나 중단하도록 요청하십시오.

또는 의도 아카이브에 추가 할 수 있다면, 당신은 할 수 :

  • 그런 다음 이전 백업과 현재의 조합을 쓰는 기존 백업을 삭제 이전 백업에서 모든 것을 추출 새 보관
+0

계획은 대상 파일 이름이 이미 있는지 확인하고 새 test.zip을 만들기 위해 삭제하는 것입니다. – TheCryptek

+0

파일이 있으면 제거하기위한 코드가 추가되었습니다! – Junuxx

+0

이것은 파일을 삭제하지만 스크립트는 파일을 사용자가 지정한 다른 디렉토리로 이동합니다. 그럼 내가 어떻게 특정 디렉토리에있는 파일을 삭제할 수 있습니다 – TheCryptek

관련 문제