Herramientas de usuario

Herramientas del sitio


python:archivos

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
python:archivos [2022/04/07 12:40] – [Función pprint.pformat()] albertopython:archivos [2023/06/05 16:55] (actual) – [Lectura/escritura con open()] alberto
Línea 162: Línea 162:
 Devuelve el número de caracteres escritos. Devuelve el número de caracteres escritos.
  
 +=== Sentencia with ===
 +Con el fin de tener un código más limpio, es común a la hora de trabajar con directorios usar la sentencia **with**, que nos permite evitar tener que estar cerrando el archivo con 'close()'. \\ 
 +Un ejemplo:
 +<code python>
 +with open('file_path', 'w') as file:
 +    file.write('hello world !')
 +</code>
 ===== Guardar variables ===== ===== Guardar variables =====
 ==== Guardar variables en archivos binarios ==== ==== Guardar variables en archivos binarios ====
Línea 210: Línea 217:
  
 ====== Trabajar con archivos y directorios ====== ====== Trabajar con archivos y directorios ======
 +===== Acciones sobre archivos y directorios =====
 +Para realizar acciones sobre archivos y directorios, como mover, copiar, renombrar o borrar, vamos a utilizar la biblioteca **shutil** //shell utilities//.
 +
 +==== Copiar ====
 +Para copiar un único archivo se utiliza el método **shutil.copy(source, destination)**.
 +  * **source**: Dirección del archivo, incluído, puede ser de tipo Path o string.
 +  * **destination**: Dirección donde se copiará archivo, también puede ser de tipo Path o string. Si se indica un nombre de archivo, además será renombrado con éste.
 +  * retorna un dato Path con el dirección del archivo copiado, incuído éste.
 +
 +Para copiar un directorio completo, con todos sus subdirectorios y archivos, se utiliza del mismo modo la función **shutil.copytree(source, destination)**. Devuelve un dato Path con el dirección del directorio copiado.
 +
 +==== Mover y renombrar ====
 +Para mover un archivo o un directorio, se utiliza el método **shutil.move(source, destination)**:
 +  * **source**: Dirección del archivo, incluído, puede ser de tipo Path o string.
 +  * **destination**: Dirección donde se moverá el archivo, también puede ser de tipo Path o string. Si se indica un nombre de archivo, además será renombrado con éste. OJO, si el último directorio especificado no existe, y no se renombra el archivo, éste será renombrado con el nombre del directorio inexistente ¡no diferencia entre nombre de archivo y nombre de directorio!
 +  * Si algún valor de los directorios intermedios donde se desea transferir el archivo o directorio no existe, se producirá un error FileNotFound.
 +  * Devuelve la dirección del directorio o archivo movido.
 +
 +==== Borrado de directorios y archivos ====
 +=== Borrado permanente ===
 +  * Para borrar permanentemente un único archivo: **os.ulink(//path//)**
 +  * Para borrar permanentemente un directorio completamene vacío: **os.rmdir(//path//)**
 +  * Para borrar permanentemente un directorio y todo su contenido: **shutil.rmtree(//path//)**
 +
 +<code python>
 +import os
 +from pathlib import Path
 +for filename in Path.home().glob('*.rxt'):
 +    #os.unlink(filename)  # Para ver los próximos archivos a eliminar, se comenta esta línea. Si estamos seguros, entonces se descomenta.
 +    print(filename)
 +</code>
 +
 +=== Borrado "seguro" ===
 +La idea es enviar los archivos a la papelera de reciclaje, en lugar de borrarlos directamente.
 +Para ellos usamos el método **send2trash()** del módulo **send2trash**.\\
 +Es un módulo de terceros que debe instalarse con //pip install --user send2trash//.
 +
 +<code python>
 +>>> import send2trash
 +>>> baconFile = open('bacon.txt', 'a'  # creates the file
 +>>> baconFile.write('Bacon is not a vegetable.')
 +25
 +>>> baconFile.close()
 +>>> send2trash.send2trash('bacon.txt')
 +</code>
 +
 +===== Recorrer un árbol de directorios =====
 +La biblioteca **os** nos proporciona la función **os.walk(//string//)**, que usada en conjunto con un bucle for (en lugar de range()), en cada iteración se mueve por los directorios del árbol, lo que  permite recorrer el arbol de directorios:\\
 +
 +En cada iteración del bucle for, la función **walk()** devuelve:
 +    * String con el directorio actual.
 +    * Una lista de strings con sus subdirectorios.
 +    * Una lista de strings con sus archivos.
 +
 +<code python>
 +'''
 +C:/
 +    delicius
 +        cats
 +            catnames.txt
 +            zophie.jpg
 +        walnut
 +            waffles
 +                butter.txt
 +        spam.txt
 +    
 +'''
 +import os
 +
 +for folderName, subfolders, filenames in os.walk('C:\\delicious'):
 +    print('The current folder is ' + folderName)
 +
 +    for subfolder in subfolders:
 +        print('SUBFOLDER OF ' + folderName + ': ' + subfolder)
 +
 +    for filename in filenames:
 +        print('FILE INSIDE ' + folderName + ': '+ filename)
 +
 +    print('')
 +</code>
 +
 +<code python>
 +The current folder is C:\delicious
 +SUBFOLDER OF C:\delicious: cats
 +SUBFOLDER OF C:\delicious: walnut
 +FILE INSIDE C:\delicious: spam.txt
 +
 +The current folder is C:\delicious\cats
 +FILE INSIDE C:\delicious\cats: catnames.txt
 +FILE INSIDE C:\delicious\cats: zophie.jpg
 +
 +The current folder is C:\delicious\walnut
 +SUBFOLDER OF C:\delicious\walnut: waffles
 +
 +The current folder is C:\delicious\walnut\waffles
 +FILE INSIDE C:\delicious\walnut\waffles: butter.txt
 +</code>
 +===== Trabajar con archivos comprimidos ZIP =====
 +Para trabajar con archivos comprimidos en ZIP, (extensión .zip) usaremo el módulo **zipfile**.\\
 +La forma de trabajar es muy similar, asignando a tipos de datos ZipFile (similares a Path) el archivo comprimido con el que trabajaremos para gestionar sus datos.
 +
 +==== Leer ZIP ====
 +Para leer archivos comprimidos en ZIP:
 +  - Asignamos el archivo a una variable ZipFile con el método ZipFile del módulo zipfile.<code python>exampleZip = zipfile.ZipFile(Path.wcd()/'ham'/'meat.zip')</code>
 +  - Podemos listar el contenido con el método **namelist()**, que devuelve una lista de strings con las direcciones relativas del contenido. <code python>exampleZip.namelist()</code>
 +  - Podemos obtener información de cualquier achivo comprimido en ZIP con el método **getinfo(//nombre_archivo//)**. Devuelve un objeto en el que se pueden consultar los atributos **file_size** y **compress_size**. <code python>spamInfo = exampleZip.getinfo('spam.txt')
 +spamInfo.file_size
 +spamInfo.compress_size</code>
 +  - Una vez hemos terminado de leer en el interior del archivo comprimido, lo cerramos con el métoo close(). <code python>exampleZip.close()</code>
 +
 +
 +==== Extraer ZIP ====
 +Para extraer todo el contenido de un ZIP, se utiliza el método **extractall()**, al que se le puede pasar un argumento string en el que se define la dirección en la que se desea extraer. Si no, se extraerá en el directorio raíz.
 +<code python>
 +import zipfile, os
 +from pathlib import Path
 +
 +p = Path.home()
 +exampleZip = zipfile.ZipFile(p / 'example.zip')
 +exampleZip.extractall()  # exampleZip.extractall('C:\\delicious') # Para extraerlo en una diección concreta.
 +exampleZip.close()
 +</code>
 +
 +Para extraer un archivo concreto se usa el método **extract()**, en la que el primer argumento es el archivo a extraer, y el segundo (opcional), la dirección en la que se extraerá (si no existe, se crea).
 +<code python>
 +>>>exampleZip.extract('spam.txt')
 +'C:\\spam.txt'
 +>>> exampleZip.extract('spam.txt', 'C:\\some\\new\\folders')
 +'C:\\some\\new\\folders\\spam.txt'
 +>>> exampleZip.close()
 +</code>
 +==== Crear y añadir a ZIP ====
 +Para crear un nuevo archivo ZIP, se utiliza el método **ZipFile()**, al iguar que se hacía para leer de su interior:
 +  * Su primer argumento será el nombre de archivo.
 +  * El segundo argumento será 
 +    * 'w' para añadir archivos o directorios, sobreescribiendo los que había antes.
 +    * 'a' para añadir archivos o directorios sin sobreescribir los que había antes.
 +
 +Para añadir elementos (archivos y directorios) al ZIP, se usará el método **write()**:
 +  * El primer argumento será un string del archivo o directorio a comprimir.
 +  * El segundo argumento será el algoritmo de comprensión que se usará, por ejemplo ZIP_DEFLATED, que va bien con cualquier tipo de dato).
 +
 +<code Python>
 +>>> import zipfile
 +>>> newZip = zipfile.ZipFile('new.zip', 'w')
 +>>> newZip.write('spam.txt', compress_type=zipfile.ZIP_DEFLATED)
 +>>> newZip.close()
 +</code>
python/archivos.1649328037.txt.gz · Última modificación: por alberto

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki