sobreescribir - Descomprimiendo archivos en python
ficheros python ejemplos (6)
Esta es una solución recursiva para ZIP y RAR:
- Simplemente crea un archivo con el código de Python que figura a continuación.
- Ejecuta el código desde cmd como
python filename.py
- Le pedirá que proporcione la ruta absoluta del archivo ZIP o RAR.
- Obtenga todos los archivos extraídos en una carpeta con el mismo nombre que el archivo zip.
- Esto es lo mismo que la funcionalidad de Winrar, "Extraer aquí".
- Se da una facilidad adicional es decir. Extracciones recursivas. si su archivo dice "a.zip" contiene otros archivos .zip como "b.zip", "c.zip", etc., entonces esos archivos también se extraerán de forma anidada.
para el soporte de RAR, necesita instalar los paquetes de python de unrar y rarfile.
pip install unrar pip install rarfile
Aún no ha terminado, ahora también tiene que instalar manualmente el unrar para Windows y Linux.
Para Linux:
sudo apt-get install unrar
Para ventanas :
Instalarlo.
- Ahora consigue el archivo unrar.exe instalado desde los archivos de programa.
Normalmente la ubicación es:
C:/Program Files (x86)/GnuWin32/bin/unrar.exe
Agregue este camino en sus variables de camino de Windows. porque esta ruta será la ruta de la herramienta unrar que se utilizará en el momento de extraer el archivo RAR.
rarfile.UNRAR_TOOL = C:/Program Files (x86)/GnuWin32/bin/unrar.exe
Si todo está configurado, está listo para desplegar.
-----------------------
#import zip file.
import zipfile
# import rarfile
import rarfile
# for path checking.
import os.path
# deleting directory.
import shutil
def check_archrive_file(loc):
''''''
check the file is an archive file or not.
if the file is an archive file just extract it using the proper extracting method.
''''''
# check if it is a zip file or not.
if (loc.endswith(''.zip'') or loc.endswith(''.rar'')):
# chcek the file is present or not .
if os.path.isfile(loc):
#create a directory at the same location where file will be extracted.
output_directory_location = loc.split(''.'')[0]
# if os path not exists .
if not os.path.exists(output_directory_location):
# create directory .
os.mkdir(output_directory_location)
print(" Otput Directory " , output_directory_location)
# extract
if loc.endswith(''.zip''):
extractzip(loc,output_directory_location)
else:
extractrar(loc,output_directory_location)
else:
# Directory allready exist.
print("Otput Directory " , output_directory_location)
# deleting previous directoty .
print("Deleting old Otput Directory ")
## Try to remove tree; if failed show an error using try...except on screen
try:
# delete the directory .
shutil.rmtree(output_directory_location)
# delete success
print("Delete success now extracting")
# extract
# extract
if loc.endswith(''.zip''):
extractzip(loc,output_directory_location)
else:
extractrar(loc,output_directory_location)
except OSError as e:
print ("Error: %s - %s." % (e.filename, e.strerror))
else:
print("File not located to this path")
else:
print("File do not have any archrive structure.")
def extractzip(loc,outloc):
''''''
using the zipfile tool extract here .
This function is valid if the file type is zip only
''''''
with zipfile.ZipFile(loc,"r") as zip_ref:
# iterate over zip info list.
for item in zip_ref.infolist():
zip_ref.extract(item,outloc)
# once extraction is complete
# check the files contains any zip file or not .
# if directory then go through the directoty.
zip_files = [files for files in zip_ref.filelist if files.filename.endswith(''.zip'')]
# print other zip files
# print(zip_files)
# iterate over zip files.
for file in zip_files:
# iterate to get the name.
new_loc = os.path.join(outloc,file.filename)
#new location
# print(new_loc)
#start extarction.
check_archrive_file(new_loc)
# close.
zip_ref.close()
def extractrar(loc,outloc):
''''''
using the rarfile tool extract here .
this function is valid if the file type is rar only
''''''
#check the file is rar or not
if(rarfile.is_rarfile(loc)):
with rarfile.RarFile(loc,"r") as rar_ref:
# iterate over zip info list.
for item in rar_ref.infolist():
rar_ref.extract(item,outloc)
# once extraction is complete
# get the name of the rar files inside the rar.
rar_files = [file for file in rar_ref.infolist() if file.filename.endswith(''.rar'') ]
# iterate
for file in rar_files:
# iterate to get the name.
new_loc = os.path.join(outloc,file.filename)
#new location
# print(new_loc)
#start extarction.
check_archrive_file(new_loc)
# close.
rar_ref.close()
else:
print("File "+loc+" is not a rar file")
def checkpathVariables():
''''''
check path variables.
if unrar.exe nor present then
install unrar and set unrar.exe in path variable.
''''''
try:
user_paths = os.environ[''PYTHONPATH''].split(os.pathsep)
except KeyError:
user_paths = []
# iterate over paths.
for item in user_paths:
print("User path python variables :"+user_paths)
# check rar tool exe present or not.
for item in user_paths:
# print(item)
if("unrar.exe" in item):
print("Unrar tool setup found PYTHONPATH")
return
print("Unrar tool setup not found in PYTHONPATH")
# print os path
os_paths_list = os.environ[''PATH''].split('';'')
# check rar tool exe present or not.
for item in os_paths_list:
# print(item)
if("unrar.exe" in item):
print("Unrar tool setup found in PATH")
rarfile.UNRAR_TOOL = item
print("Unrar tool path set up complete ."+item)
return
print("Unrar tool setup not found in PATH")
print("RAR TOOL WILL NOT WORK FOR YOU.")
downloadlocation = "https://www.rarlab.com/rar/unrarw32.exe"
print("install unrar form the link"+downloadlocation)
# run the main function
if __name__ == ''__main__'':
''''''
before you run this function make sure you have installed two packages
unrar and rarfile.
if not installed then
pip install unrar
pip install rarfile.
This is not only the case unrar tool should be set up.
zip is included in standard library so do not worry about the zip file.
''''''
# check path and variables.
checkpathVariables()
# Take input form the user.
location = input(''Please provide the absolute path of the zip/rar file-----> '')
check_archrive_file(location)
-----------------------
Do not Panic es un largo script dividido principalmente en cuatro partes.
Parte 1
Compruebe que ha instalado correctamente la variable de ruta. Esta sección no es necesaria si no desea trabajar con el archivo RAR.
def checkpathVariables():
''''''
check path variables.
if unrar.exe nor present then
install unrar and set unrar.exe in path variable.
''''''
try:
user_paths = os.environ[''PYTHONPATH''].split(os.pathsep)
except KeyError:
user_paths = []
# iterate over paths.
for item in user_paths:
print("User path python variables :"+user_paths)
# check rar tool exe present or not.
for item in user_paths:
# print(item)
if("unrar.exe" in item):
print("Unrar tool setup found PYTHONPATH")
return
print("Unrar tool setup not found in PYTHONPATH")
# print os path
os_paths_list = os.environ[''PATH''].split('';'')
# check rar tool exe present or not.
for item in os_paths_list:
# print(item)
if("unrar.exe" in item):
print("Unrar tool setup found in PATH")
rarfile.UNRAR_TOOL = item
print("Unrar tool path set up complete ."+item)
return
print("Unrar tool setup not found in PATH")
print("RAR TOOL WILL NOT WORK FOR YOU.")
downloadlocation = "https://www.rarlab.com/rar/unrarw32.exe"
print("install unrar form the link"+downloadlocation)
Parte 2
Esta función extrae un archivo ZIP. Toma dos argumentos loc y outloc. loc = "Nombre de archivo con ruta absoluta". outloc = "Archivo donde será extraído".
def extractzip(loc,outloc):
''''''
using the zipfile tool extract here .
This function is valid if the file type is zip only
''''''
with zipfile.ZipFile(loc,"r") as zip_ref:
# iterate over zip info list.
for item in zip_ref.infolist():
zip_ref.extract(item,outloc)
# once extraction is complete
# check the files contains any zip file or not .
# if directory then go through the directoty.
zip_files = [files for files in zip_ref.filelist if files.filename.endswith(''.zip'')]
# print other zip files
# print(zip_files)
# iterate over zip files.
for file in zip_files:
# iterate to get the name.
new_loc = os.path.join(outloc,file.filename)
#new location
# print(new_loc)
#start extarction.
check_archrive_file(new_loc)
# close.
zip_ref.close()
Parte 3
Esta función extrae un archivo RAR. Casi lo mismo que zip.
def extractrar(loc,outloc):
''''''
using the rarfile tool extract here .
this function is valid if the file type is rar only
''''''
#check the file is rar or not
if(rarfile.is_rarfile(loc)):
with rarfile.RarFile(loc,"r") as rar_ref:
# iterate over zip info list.
for item in rar_ref.infolist():
rar_ref.extract(item,outloc)
# once extraction is complete
# get the name of the rar files inside the rar.
rar_files = [file for file in rar_ref.infolist() if file.filename.endswith(''.rar'') ]
# iterate
for file in rar_files:
# iterate to get the name.
new_loc = os.path.join(outloc,file.filename)
#new location
# print(new_loc)
#start extarction.
check_archrive_file(new_loc)
# close.
rar_ref.close()
else:
print("File "+loc+" is not a rar file")
Parte 4
La función principal pide al usuario la ruta absoluta. Puede cambiarlo a una ruta predefinida configurando el valor de ubicación. y comentar la función de entrada.
if __name__ == ''__main__'':
''''''
before you run this function make sure you have installed two packages
unrar and rarfile.
if not installed then
pip install unrar
pip install rarfile.
This is not only the case unrar tool should be set up.
zip is included in standard library so do not worry about the zip file.
''''''
# check path and variables.
checkpathVariables()
# Take input form the user.
location = input(''Please provide the absolute path of the zip/rar file-----> '')
check_archrive_file(location)
Problemas que aún se presentan.
- Esta solución no es capaz de extraer todo tipo de archivos RAR.
- Aunque pasa la comprobación de
rarfile.is_rarfile("filename")
Lo verifiqué con el RAR creado por WinRAR; proporciona una advertencia y no extrae los archivos.
[Por favor comente si puede ayudar con respecto a esta advertencia y emita]
rarfile.RarWarning: Non-fatal error [1]: b''/r/nD://Kiosk//Download//Tutorial//reezoo//a.rar is not RAR archive/r/nNo files to extract/r/n
Pero puede extraer fácilmente el tipo RAR4.
Leí la documentación de los módulos zipfile, pero no pude entender cómo descomprimir un archivo, solo cómo comprimir un archivo. ¿Cómo descomprimo todos los contenidos de un archivo zip en el mismo directorio?
Si está utilizando Python 3.2 o posterior:
import zipfile
with zipfile.ZipFile("file.zip","r") as zip_ref:
zip_ref.extractall("targetdir")
No es necesario utilizar el cierre o probar / capturar con esto, ya que utiliza la construcción del administrador de contexto .
Use el método extractall
, si está usando Python 2.6+
zip = ZipFile(''file.zip'')
zip.extractall()
También puedes importar solo ZipFile
:
from zipfile import ZipFile
zf = ZipFile(''path_to_file/file.zip'', ''r'')
zf.extractall(''path_to_extract_folder'')
zf.close()
Trabaja en Python 2 y Python 3 .
import os
zip_file_path = "C:/AA/BB"
file_list = os.listdir(path)
abs_path = []
for a in file_list:
x = zip_file_path+''//'+a
print x
abs_path.append(x)
for f in abs_path:
zip=zipfile.ZipFile(f)
zip.extractall(zip_file_path)
Esto no contiene validación para el archivo si no es zip. Si la carpeta no contiene un archivo .zip, fallará.
import zipfile
zip_ref = zipfile.ZipFile(path_to_zip_file, ''r'')
zip_ref.extractall(directory_to_extract_to)
zip_ref.close()
¡Eso es practicamente todo!