Este artículo explica cómo se pueden realizar varias operaciones en un archivo zip utilizando un programa de python simple.
¿Qué es un archivo zip?
ZIP es un formato de archivo que admite la compresión de datos sin pérdidas. Por compresión sin pérdidas, queremos decir que el algoritmo de compresión permite reconstruir perfectamente los datos originales a partir de los datos comprimidos. Por lo tanto, un archivo ZIP es un único archivo que contiene uno o más archivos comprimidos, lo que ofrece una forma ideal de reducir el tamaño de los archivos grandes y mantener juntos los archivos relacionados.
¿Por qué necesitamos archivos zip?
- Para reducir los requisitos de almacenamiento.
- Para mejorar la velocidad de transferencia sobre las conexiones estándar.
Para trabajar en archivos zip usando python, usaremos un módulo de python incorporado llamado zipfile .
1. Extraer un archivo zip
# importing required modules from zipfile import ZipFile # specifying the zip file name file_name = "my_python_files.zip" # opening the zip file in READ mode with ZipFile(file_name, 'r') as zip: # printing all the contents of the zip file zip.printdir() # extracting all the files print('Extracting all the files now...') zip.extractall() print('Done!')
El programa anterior extrae un archivo zip llamado «my_python_files.zip» en el mismo directorio que este script de python.
La salida del programa anterior puede verse así:
Tratemos de entender el código anterior en partes:
-
from zipfile import ZipFile
ZipFile es una clase de módulo zipfile para leer y escribir archivos zip. Aquí importamos solo la clase ZipFile del módulo zipfile.
-
with ZipFile(file_name, 'r') as zip:
Aquí, se crea un objeto ZipFile llamando al constructor ZipFile que acepta el nombre del archivo zip y los parámetros de modo. Creamos un objeto ZipFile en modo READ y lo llamamos zip .
-
zip.printdir()
El método printdir() imprime una tabla de contenido para el archivo.
-
zip.extractall()
El método extractall() extraerá todo el contenido del archivo zip al directorio de trabajo actual. También puede llamar al método extract() para extraer cualquier archivo especificando su ruta en el archivo zip.
Por ejemplo:zip.extract('python_files/python_wiki.txt')
Esto extraerá solo el archivo especificado.
Si desea leer algún archivo específico, puede hacerlo así:
data = zip.read(name_of_file_to_read)
2. Escribir en un archivo zip
Considere un directorio (carpeta) con tal formato:
Aquí, necesitaremos rastrear todo el directorio y sus subdirectorios para obtener una lista de todas las rutas de los archivos antes de escribirlos en un archivo zip.
El siguiente programa hace esto rastreando el directorio que se va a comprimir:
# importing required modules from zipfile import ZipFile import os def get_all_file_paths(directory): # initializing empty file paths list file_paths = [] # crawling through directory and subdirectories for root, directories, files in os.walk(directory): for filename in files: # join the two strings in order to form the full filepath. filepath = os.path.join(root, filename) file_paths.append(filepath) # returning all file paths return file_paths def main(): # path to folder which needs to be zipped directory = './python_files' # calling function to get all file paths in the directory file_paths = get_all_file_paths(directory) # printing the list of all files to be zipped print('Following files will be zipped:') for file_name in file_paths: print(file_name) # writing files to a zipfile with ZipFile('my_python_files.zip','w') as zip: # writing each file one by one for file in file_paths: zip.write(file) print('All files zipped successfully!') if __name__ == "__main__": main()
La salida del programa anterior se ve así:
Tratemos de entender el código anterior dividiéndolo en fragmentos:
-
def get_all_file_paths(directory): file_paths = [] for root, directories, files in os.walk(directory): for filename in files: filepath = os.path.join(root, filename) file_paths.append(filepath) return file_paths
En primer lugar, para obtener todas las rutas de archivos en nuestro directorio, hemos creado esta función que utiliza el método os.walk() . En cada iteración, todos los archivos presentes en ese directorio se agregan a una lista llamada file_paths .
Al final, devolvemos todas las rutas de archivo. -
file_paths = get_all_file_paths(directory)
Aquí pasamos el directorio a comprimir a la función get_all_file_paths() y obtenemos una lista que contiene todas las rutas de archivo.
-
with ZipFile('my_python_files.zip','w') as zip:
Aquí, creamos un objeto ZipFile en modo ESCRIBIR esta vez.
-
for file in file_paths: zip.write(file)
Aquí, escribimos todos los archivos en el archivo zip uno por uno usando el método de escritura .
3. Obtener toda la información sobre un archivo zip
# importing required modules from zipfile import ZipFile import datetime # specifying the zip file name file_name = "example.zip" # opening the zip file in READ mode with ZipFile(file_name, 'r') as zip: for info in zip.infolist(): print(info.filename) print('\tModified:\t' + str(datetime.datetime(*info.date_time))) print('\tSystem:\t\t' + str(info.create_system) + '(0 = Windows, 3 = Unix)') print('\tZIP version:\t' + str(info.create_version)) print('\tCompressed:\t' + str(info.compress_size) + ' bytes') print('\tUncompressed:\t' + str(info.file_size) + ' bytes')
La salida del programa anterior puede verse así:
for info in zip.infolist():
Aquí, el método infolist() crea una instancia de la clase ZipInfo que contiene toda la información sobre el archivo zip.
Podemos acceder a toda la información, como la fecha de última modificación de los archivos, los nombres de los archivos, el sistema en el que se crearon los archivos, la versión Zip, el tamaño de los archivos comprimidos y sin comprimir, etc.
Este artículo es una contribución de Nikhil Kumar . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA