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 11:57] – [Función pprint.pformat()] albertopython:archivos [2023/06/05 16:55] (actual) – [Lectura/escritura con open()] alberto
Línea 1: Línea 1:
-====== Lectura y escritura de archivos y directorios ======+====== Conceptos básicos de archivos y directorios ======
 ===== Definición de direcciones de archivo o directorio ===== ===== Definición de direcciones de archivo o directorio =====
 Un archivo tiene habitualmente dos //key properties//: un nombre de archivo o //filename//, y un directorio o //path// donde se encuentra.\\ Un archivo tiene habitualmente dos //key properties//: un nombre de archivo o //filename//, y un directorio o //path// donde se encuentra.\\
Línea 53: Línea 53:
  
 El directorio de usuario depende del Sistema Operativo, y es donde se guarda la información del usuario. Se recomienda usar este directorio para poner nuestros programas, ya que así nos aseguramos de tener todos los permisos necesarios. El directorio de usuario depende del Sistema Operativo, y es donde se guarda la información del usuario. Se recomienda usar este directorio para poner nuestros programas, ya que así nos aseguramos de tener todos los permisos necesarios.
-===== Trabajar con directorios =====+===== Creación y manejo de directorios =====
 ==== Creación de directorios ==== ==== Creación de directorios ====
 Se pueden crear directorios, así como los directorios intermedios definifos si no existen, con la función **os.makedirs()**. Se pasa como argumento un string con la dirección completa.\\ Se pueden crear directorios, así como los directorios intermedios definifos si no existen, con la función **os.makedirs()**. Se pasa como argumento un string con la dirección completa.\\
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 =====
-==== Módulo shelve ====+==== Guardar variables en archivos binarios ====
 Con el módulo **shelve** se pueden guardar variables en un archivo binario, para después recuperar sus valores. De ese modo, no se pierde informaión al cerrar el programa (las variables normales son destruidas).\\ Con el módulo **shelve** se pueden guardar variables en un archivo binario, para después recuperar sus valores. De ese modo, no se pierde informaión al cerrar el programa (las variables normales son destruidas).\\
  
Línea 185: Línea 192:
 shelfFile.close() shelfFile.close()
 </code> </code>
-==== Función pprint.pformat() ====+==== Guardar variables en archivos de texto .py ====
 En este caso la idea es guardar las variables en un archivo de python (.py), de forma que pueda importarse como una biblioteca, y de ese modo recuperar los dartos.\\ En este caso la idea es guardar las variables en un archivo de python (.py), de forma que pueda importarse como una biblioteca, y de ese modo recuperar los dartos.\\
 Para ello se utiliza el método **pformat()** de la biblioteca **pprint** (//Pretty Print//), que devuelve una variable tal y cmo se escribe en código. Para ello se utiliza el método **pformat()** de la biblioteca **pprint** (//Pretty Print//), que devuelve una variable tal y cmo se escribe en código.
Línea 208: Línea 215:
 De este modo se pueden guardar variables de tipos básicos (string, enteros, listas, diccionarios, etc), pero no de tipos más complejos (como Files).\\ De este modo se pueden guardar variables de tipos básicos (string, enteros, listas, diccionarios, etc), pero no de tipos más complejos (como Files).\\
 Para guardar datos más complejos es necesario usar el módulo shelve. Para guardar datos más complejos es necesario usar el módulo shelve.
 +
 +====== 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.1649325470.txt.gz · Última modificación: por alberto

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki