Você está na página 1de 13
Como criar um arquivo zip de um Perguntas semelhantes: Comando do shell para.o diretério em Python? distor ac undo 9 oO ™ determinados arquivos ‘Como posso criar um arquivo zip de uma estrutura de diretorios em Python? oe @ Como tarum diretério de arquivos « pastas sem Anincios Google incuico propia diretério? & 382 i'mais este anincio | Anuncio? Por qué? Como eriar um arquivo, Zip.com o PowerShell” Ora 10S coma definiro icone do aplicative e iniciar 21 Nao use a solucSo sugerida na resposta aceita, mas a mais abaixo usando make_arch: ‘mq _ shutil (se vocé deseja compactar um tnico diret6rio recusivamente). nana . entrada de uma sta de Respostas: arsuven ©) 166 526 Como outros jé apontaram, vacé deve usar 0 Cy disponives, mas realmente nio explica como voc® pode usi-as para compacta um diretério intro acho pflle A documentagdo informa quais fungdes esto que & mais facil explicar com algum cédigo de exemplo: FEY tvesrroinrenv pytnon Amport os import 2ipfile der Sf _name__ == *_nain_° zipdir(path, ziph): # 2iph is zipfile handle for root, dirs, Files in os.walk(path): for file in files: 2iphwnite(os.path.foin(root, file)) Zip = zipfile.zipFite(‘Python.zip', ‘w', zipfile.ZIP_DEFLATED) zipdir(*tep/", zipf) zipf.close() ‘Adaptado de: http.//wony devshed,com/c/a/Python/Python-UnTipped/ 129 Ewadiciona 3 wal um segundo argumento a chamada de gravacio, passando os.path.relpath(os.path.Join(rost, file), 0s.path.Join(path, *..")) . Isso permitria qf vocé zipasse um diretério de qualquer diretério ative, sem obter os caminhos absolutos completos no arquivo morto, Ha uma recursso engragada quando tento compactar uma pasta e enviar 0 zip resultante para a ‘mesma pasta. 3) shutil torna muito facil em apenas uma linha. Por favor, verfique a resposta abaixo poidour IT 7 vocé pode estar mais interessado fazendo ziph.write (os pathoin (caminho, arquivo), arcname = ‘mj arquivo) para que os nomes de arquivos dentro do pacote nao so em relagio ao disco rigido = Chetan 1 An estava faltando a close) ligacio! a —bimataoientange 1063 Amaneira mas fii é usar shusit ake anchivs. le suporta 0s formatos ip eta DO famport sn shit eshesprchive(output_flimame, ‘2ip!> dirname) ZI se-vocé precisar fazer algo mais complicado do que compactaro diretriointeiro (como pular certos arquivos), precsaré cavar no 2ip¢iie médulo, conforme sugerido por outros. cain Chiov 113. shucil faz parte da biblioteca python padrio, Esta deve ser a resposta superior —Aas 4 ssa € a resposta mais concisa aqui e também tem a vantagem de adicionar todos os ‘aj subdiretrios e arquivos ao arquivo dlretamente, em vez de inclu tudo em uma pasta de nivel superior (0 que resulta em um nivel redundante na estrutura da pasta a0 descompactar. 3 @emeginty, vocé poderia ser um pouco mais especifco sobre qual aspecto nfo & seguro para ‘m__ threads? A execucio de vitos threads enquanto alguém chama isso causa uma falha no imérprete? 13. Estejaavisado de que, antes do Python 34,0 shutilmake_archive nfo supertaZ1P64 efalharé a0 sq 10 Vocé nfo pode usar um em with vez de ter que close() se chamar no final? go — ete Como posso criar um arquivo zip de uma estrutura de diretorios em Python? Em um script Python No Python 2.7, shutil tem uma make archive fungdo. fron shutil import make_archive ake_archive( ‘zipfile_nane’, 4 the archive format - or tar, beter, gztar ne, root for archive - current working dir if None ne) start archiving from here - cud if None too ‘Aqui o arquivo compactado seré nomeado 2ipfile_nane.2ip. Se base_dir estiver mais abaixo reot_dir , excluiré os arquivos que néo estio no diretério base_dir , mas ainda arquivaré os arquivos nos diretérios pai até o diretério reot_air Eu tive um problema ao testar isso no Cygwin com 2:7 ele quer um argumento root dir, para cw sake_archive(“zipfile nase", ‘2ip", root_dire’.") Usando Python a partir do shell \Vocé pode fazer sso com o Python a partir do shell também usando © zipfile médulo: $ python -m zipfile -c zipnane sourcedir ‘Onde zipnane esta o nome do arquivo de destino que vocé deseja (adicione, .zip se quiser, ele nio 0 faré automaticamente) e sourcedir é o caminho para o diretério, Fechando o Python (ou simplesmente nao quer o diretorio pai): Se vocé esté tentando compactar um pacote python com um __ init__.py e _nain_.py, € vocé no deseja o diretério pai, € $ python -m zipfile -c zipnare sourcedir/* E $ python zipnane ‘executaria 0 pacote. (Observe que vocé no pode executar subpacotes como ponte de entrada de um arquivo compactado) Fechando um aplicativo Python: Se voce tem python3.5 + e deseja especificamente compactar um pacote Python, use zipap 32 o 74 '$ python -m zipapp ayapp + python myapp.pyz Aon at Give Essa fungao compactard recursivamente uma arvore de diretérios, compactando os arquivos e gravando ‘95 nomes de arquivos relatives corretos no arquivo morte. As entradas de arquivamento si as mesmas ‘que as geradas por zip -r cutput.zip source dir import 05 impoot ripéile def wake zipfile(output_filenane, source dir): rrelroot = 05.path.abspath(os.path.Join(source dir, os.pardir)) with zipfile.Ziprile(output_filenane, "w", zipfile.ZIP_DEFLATED) as zip: for root, dirs, Files in os.walk(source dir): 4 add directory (needed for enpty dirs) 2ip.write(roct, os.path.relpath(rect, relroot)) for fale in files: Filename = 05.path.join(root, file) if os.path-isfile(ilenane): # regular files only ‘arcnane = 05.path-Join(os.path.relpath(rost, relroct), file) zip.write(filename, arcnane) — Senge ail Stone Use shuti, que faz parte do conjunto de bibliotecas padrao do python. O uso do shutilé tdo simples (ueja © cédigo abaixo): #12 argumento: nome do arquivo zip / tar resultante, # 2° argumento: zip / tar, * Terceiro argumento: dit_name édigo: Amport shuts shutil make_archive("/hone/user/Desktop/Fillenane" ,"2ip',' /howe/username/Desktop/Directory") sada ahacica Bone Para adicionar compactacio a0 arquivo zip resultante, confira este link Vocé precisa mudar: zip = zipfile.2ipFile(’Python.2ip", “w") para zip = zipfile.ZipFile(’Python.zip", ‘w", zipfile.21P_DEFLATED) Fiz algumas alterages no cédigo fornecidas por Mark Byers A fungio abaixo também adiciona dliretérios vazios, se vocé os tiver, Os exemplos devem deixar mais claro qual é o caminho adicionado ao zip. Os l/usr/ein/env python import os Anport zipfile def addoirTozip(zipHandle, path, basePath=" ‘Adding directory given by \a path to opened zip file \a zipHandie param basePath path that will be removed from \a path when adding to archive Examples: 4 add whole "dir* to "test.zip" (when you open “test.zip" you will see only “dir”) zipMandle = zipfile.zipFile("test.zip', "w') adéDirToZip(zipkandle, ‘dir') zipHandle.close() # add contents of “air” to “test.zip" (when you open “test.zip" you will see only S's contents) zipiandle = zipfile.ziprile("test.2ip', ‘w') adéoirTozip(zipkandie, ‘dir’, ‘dir') zipMandle.close() # add contents of “éir/subdin” to “test.zip" (when you open “test.zip" you will see ‘only contents of “subdir") zipHandle = zipfile.zipFile(‘test.2ip', ‘w') adéDirTozip(ziphandle, ‘dir/subdir', ‘dir/subéir’) zipHandle.close() ‘Acima esté uma funcao simples que deve funcionar em casos simples, Vocé pode encontrar uma classe mais elegante em meu Gist: https.//o'stolthuls com/Fccenux/1752612310/ca0ac?8e6 tone 1 Otratamento do caminho pode ser bastante simplificado usando os.path . Veja minha resposta = George v Rally ‘Bug: zipHandle.write (ospathyjoin (root, Bae 1) Nie leva em consideragio o basePath, 1m Sim, voc® provavelmente esta certo, Mais tarde, aprimorei isso um pouco :-) sist oithub com/Eccenux/17526123107ca0ac?te6 a Python moderno (3.6+) usando 0 pathiiis médulo para manipulagdo concisa de caminhos no modo. OOP e patilis Sach rp lob() globbing recursive. Até onde eu sei, sso & equivalente & resposta de George V. Reilly: fecha com compressio, 0 elemento superior é um diretério, mantém dirs vazios, usa ‘caminhos relativos. fron pathLib inport Path fron 2ipfile import Z1P_DEFLATED, ZipFile from os inport PathLike fron typing ieport Union def 2ip_dir(eip_nanet str, source dir: Union[str, PathLike]) src_path = Path(source dir) expanduser().resolve(strict+True) with ZipFile(zip rane, ‘x’, ZIP DEFLATED) as 2F: for file in sre_path.nglob('*"): 2fowrite(file, File.relative_to(sre_psth.parent)) 3 6 a Nota: como as dicas de tipo opcionais indicam, zip_nane no pode ser um objeto Path (seria corrigido em 362+). tance morse, 3 1. Fantistico! Concise! Moderna! fe —nneezzme Eu tenho outro exemplo de cédigo que pode ajudar, usando python3, pathlibe zipfile, Deve funcionar ‘em qualquer sistema operacional fron pathlib inport Path import 2ipfile From datetine inport datetine DATE_FORMAT = "xytaca" def date_str() swsreturns the today string year, month, day’ retuen °{)' format (datetime. now().

Você também pode gostar