{"id":470,"date":"2025-03-31T20:22:16","date_gmt":"2025-03-31T18:22:16","guid":{"rendered":"https:\/\/www.pythonparatodo.com\/?p=470"},"modified":"2025-03-31T20:32:59","modified_gmt":"2025-03-31T18:32:59","slug":"python-y-los-archivos-zip","status":"publish","type":"post","link":"https:\/\/www.pythonparatodo.com\/?p=470","title":{"rendered":"Python y los archivos zip"},"content":{"rendered":"\n<p><strong>\u00bfQu\u00e9 es un zip?<\/strong><\/p>\n\n\n\n<p>Un zip es un archivo con formato comprimido que puede contener uno o m\u00e1s archivos y directorios en su interior. La ventaja principal es que reduce el tama\u00f1o de los archivos, lo cual facilita su almacenamiento y transferencia. Es como una caja que contiene varios objetos, pero la caja est\u00e1 compactada para ocupar menos espacio.<\/p>\n\n\n\n<p><strong>El m\u00f3dulo <code>zipfile<\/code> de Python<\/strong><\/p>\n\n\n\n<p>Es una biblioteca estandar de Python que permite trabajar con archivos zip, ya sea cre\u00e1ndolos, abri\u00e9ndolos, extrayendo contenido o incluso modificando su estructura interna.<\/p>\n\n\n\n<p>El m\u00f3dulo <code>zipfile<\/code> proporciona clases para crear, leer, escribir y extraer archivos zip. Ofrece una interfaz sencilla para interactuar con estos archivos, sin necesidad de entender los detalles del formato zip internamente.<\/p>\n\n\n\n<p><strong>Clases principales<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>ZipFile(nombre_archivo, modo)<\/code><\/strong>: Esta clase es la base para trabajar con archivos zip.\n<ul class=\"wp-block-list\">\n<li><code>nombre_archivo<\/code>: La ruta al archivo ZIP que quieres usar.<\/li>\n\n\n\n<li><code>modo<\/code>: Especifica c\u00f3mo se abrir\u00e1 el archivo:\n<ul class=\"wp-block-list\">\n<li><code>'r'<\/code> (read): Abre el archivo zip para lectura.<\/li>\n\n\n\n<li><code>'w'<\/code> (write): Crea un nuevo archivo zip o lo sobrescribe si ya existe.<\/li>\n\n\n\n<li><code>'a'<\/code> (append): A\u00f1ade archivos al archivo zip existente.<\/li>\n\n\n\n<li><code>'x'<\/code> (create): Crea un nuevo archivo zip, pero falla si el archivo ya existe.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong><code>ZipInfo<\/code><\/strong>: Representa la informaci\u00f3n de un solo miembro (archivo o directorio) dentro del archivo zip. Contiene detalles como el nombre, tama\u00f1o, fecha de modificaci\u00f3n y si es un directorio.<\/li>\n\n\n\n<li><strong><code>ZipFile.namelist()<\/code><\/strong>: Devuelve una lista de los nombres de todos los archivos y directorios dentro del archivo zip.<\/li>\n\n\n\n<li><strong><code>ZipFile.getinfo(nombre)<\/code><\/strong>: Devuelve un objeto <code>ZipInfo<\/code> para el miembro especificado por su nombre.<\/li>\n\n\n\n<li><strong><code>ZipFile.write(nombre_archivo, filename=None, compress_type=zipfile.ZIP_DEFLATED)<\/code><\/strong>: Escribe un archivo o directorio en el archivo zip.\n<ul class=\"wp-block-list\">\n<li><code>nombre_archivo<\/code>: La ruta al archivo que se va a a\u00f1adir.<\/li>\n\n\n\n<li><code>filename<\/code>: El nombre con el que se guardar\u00e1 el archivo dentro del archivo zip. Si no se especifica, usa el nombre original.<\/li>\n\n\n\n<li><code>compress_type<\/code>: El tipo de compresi\u00f3n a usar (por ejemplo, <code>zipfile.ZIP_DEFLATED<\/code> es la m\u00e1s com\u00fan).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong><code>ZipFile.extract(nombre_archivo, filename=None, pwd=None)<\/code><\/strong>: Extrae un archivo o directorio del archivo ZIP al directorio actual.\n<ul class=\"wp-block-list\">\n<li><code>nombre_archivo<\/code>: El nombre del archivo dentro del ZIP que se va a extraer.<\/li>\n\n\n\n<li><code>filename<\/code>: El nombre con el que se guardar\u00e1 el archivo extra\u00eddo. Si no se especifica, usa el nombre original.<\/li>\n\n\n\n<li><code>pwd<\/code>: La contrase\u00f1a para descomprimir el archivo (si est\u00e1 protegido).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p><strong>Ejemplos:<\/strong><\/p>\n\n\n\n<p><strong>1. Crear un archivo zip<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import zipfile\n\n# Nombre del archivo ZIP que queremos crear\nnombre_archivo_zip = \"mi_archivo.zip\"\n\n# Crear un objeto ZipFile en modo escritura ('w')\nwith zipfile.ZipFile(nombre_archivo_zip, 'w') as archivo_zip:\n    # A\u00f1adir archivos al archivo ZIP\n    archivo_zip.write(\"archivo1.txt\")  # A\u00f1ade el archivo \"archivo1.txt\"\n    archivo_zip.write(\"carpeta\/archivo2.txt\") # A\u00f1ade un archivo dentro de una carpeta<\/code><\/pre>\n\n\n\n<p><strong>2. A\u00f1adir archivos a un zip existente<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import zipfile\n\nnombre_archivo_zip = \"mi_archivo.zip\"\n\nwith zipfile.ZipFile(nombre_archivo_zip, 'a') as archivo_zip:\n    archivo_zip.write(\"archivo3.txt\") # A\u00f1ade un nuevo archivo<\/code><\/pre>\n\n\n\n<p><strong>3. Extraer archivos de un  zip<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import zipfile\n\nnombre_archivo_zip = \"mi_archivo.zip\"\n\nwith zipfile.ZipFile(nombre_archivo_zip, 'r') as archivo_zip:\n    # Extraer todos los archivos al directorio actual\n    archivo_zip.extractall()\n\n    # Extraer un archivo espec\u00edfico con un nombre diferente\n    archivo_zip.extract(\"archivo1.txt\", \"nuevo_nombre_archivo.txt\") # Extrae \"archivo1.txt\" y lo guarda como \"nuevo_nombre_archivo.txt\"<\/code><\/pre>\n\n\n\n<p><strong>4. Trabajando con contrase\u00f1as<\/strong><\/p>\n\n\n\n<p>La biblioteca no puede proteger el archivo zip con contrase\u00f1a, pero si puede descomprimir un archivo zip protegido con esta.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import zipfile\n\nnombre_archivo_zip = \"mi_archivo.zip\"\nclave = b\"mi_clave\" # La contrase\u00f1a debe ser bytes\n\nwith zipfile.ZipFile(nombre_archivo_zip, 'r') as archivo_zip:\n    try:\n        archivo_zip.extractall(pwd=clave)\n    except RuntimeError as e:\n        print(f\"Error al extraer el archivo: {e}\")<\/code><\/pre>\n\n\n\n<p><strong>Cosas a tener en cuenta<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Siempre usar <code>with <\/code>para abrir archivos zip, esto asegura que se cierren correctamente incluso si ocurren errores.<\/li>\n\n\n\n<li>La contrase\u00f1a debe ser un objeto de bytes (<code>b\"\"<\/code>) y no una cadena normal.<\/li>\n<\/ul>\n\n\n\n<p><strong>Recursos adicionales<\/strong><\/p>\n\n\n\n<p>Esto es una introducci\u00f3n a la biblioteca zipfile, si est\u00e1s interesado en usarla en tus scripts encontrar\u00e1s mas informaci\u00f3n aqu\u00ed: <a href=\"https:\/\/docs.python.org\/3.13\/library\/zipfile.html#zipfile.ZipInfo._for_archive\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/docs.python.org\/3.13\/library\/zipfile.html#zipfile.ZipInfo._for_archive<\/a><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfQu\u00e9 es un zip? Un zip es un archivo con formato comprimido que puede contener uno o m\u00e1s archivos y &hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[179,4],"tags":[180,34,2,6,182,181],"class_list":["post-470","post","type-post","status-publish","format-standard","hentry","category-compresion","category-python","tag-compresion","tag-ficheros","tag-python","tag-python3","tag-unzip","tag-zip"],"_links":{"self":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/470","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=470"}],"version-history":[{"count":2,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/470\/revisions"}],"predecessor-version":[{"id":472,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/470\/revisions\/472"}],"wp:attachment":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=470"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=470"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=470"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}