domingo, 2 de febrero de 2014

Operaciones con archivos

Un archivo es información identificada con un nombre que puede ser almacenada de manera permanente en el directorio de un dispositivo.

Abrir archivo


Antes de poder realizar cualquier operación de lectura/escritura hay que abrir el archivo con open() indicando su ubicación y nombre seguido, opcionalmente, por el modo o tipo de operación a realizar y la codificación que tendrá el archivo. Si no se indica el tipo de operación el archivo se abrirá en modo de lectura y si se omite la codificación se utilizará la codificación actual del sistema. Si no existe la ruta del archivo o se intenta abrir para lectura un archivo inexistente se producirá una excepción del tipo IOerror.

ObjArchivo = open('/home/archivo.txt')
ObjArchivo = open('/home/archivo.txt', 'r')
ObjArchivo = open('/home/archivo.txt', 
                  mode='r', encoding='utf-8')


¿Y qué codificación utiliza nuestro sistema? Podemos averiguarlo ejecutando las siguientes líneas de código:

import locale
print(locale.getpreferredencoding())

Las operaciones que pueden realizarse sobre un archivo:

rLectura
r+Lectura/Escritura
wSobreescritura. Si no existe archivo se creará
aAñadir. Escribe al final del archivo
bBinario
+Permite lectura/escritura simultánea
USalto de línea universal: win cr+lf, linux lf y mac cr
rbLectura binaria
wbSobreescritura binaria
r+bLectura/Escritura binaria


Cerrar archivo


Después de terminar de trabajar con un archivo lo cerraremos con el método close.

ObjArchivo.close

Leer archivo: read, readline, readlines, with-as


Con el método read() es posible leer un número de bytes determinados. Si no se indica número se leerá todo lo que reste o si se alcanzó el final de fichero devolverá una cadena vacía.

# Abre archivo en modo lectura
archivo = open('archivo.txt','r')

# Lee los 9 primeros bytes
cadena1 = archivo.read(9)

# Lee la información restaste 
cadena2 = archivo.read()

# Muestra la primera lectura  
print(cadena1)

# Muestra la segunda lectura
print(cadena2)

# Cierra el archivo 
archivo.close  

El método readline() lee de un archivo una línea completa

# Abre archivo en modo lectura
archivo = open('archivo.txt','r')  

# inicia bucle infinito para leer línea a línea
while True: 
    linea = archivo.readline()  # lee línea
    if not linea: 
        break  # Si no hay más se rompe bucle
    print(linea)  # Muestra la línea leída
archivo.close  # Cierra archivo

El método readlines() lee todas las líneas de un archivo como una lista. Si se indica el parámetro de tamaño leerá esa cantidad de bytes del archivo y lo necesario hasta completar la última linea.

# Abre archivo en modo lectura
archivo = open('archivo.txt','r')

# Lee todas la líneas y asigna a lista
lista = archivo.readlines()  

# Inicializa un contador
numlin = 0  

# Recorre todas los elementos de la lista
for linea in lista:
    # incrementa en 1 el contador  
    numlin += 1
    # muestra contador y elemento (línea)
    print(numlin, linea)
  
archivo.close  # cierra archivo

with-as permite usar los archivos de forma óptima cerrándolos y liberando la memoria al concluir el proceso de lectura.

# abre archivo (y cierra cuando termine lectura)
with open("indice.txt") as fichero:
    # recorre línea a línea el archivo
    for linea in fichero:
        # muestra línea última leída
        print(linea)  

Escribir en archivo: write, writelines


El método write() escribe una cadena y el método writelines() escribe una lista a un archivo. Si en el momento de escribir el archivo no existe se creará uno nuevo.

cadena1 = 'Datos'  # declara cadena1
cadena2 = 'Secretos'  # declara cadena2

# Abre archivo para escribir
archivo = open('datos1.txt','w')

# Escribe cadena1 añadiendo salto de línea 
archivo.write(cadena1 + '\n')

# Escribe cadena2 en archivo
archivo.write(cadena2) 

# cierra archivo
archivo.close


# Declara lista
lista = ['lunes', 'martes', 'miercoles', 'jueves', 'viernes']  

# Abre archivo en modo escritura
archivo = open('datos2.txt','w')

# Escribe toda la lista en el archivo
archivo.writelines(lista)  

# Cierra archivo
archivo.close  

Mover el puntero: seek(), tell()


El método seek() desplaza el puntero a una posición del archivo y el método tell() devuelve la posición del puntero en un momento dado (en bytes).

# Abre archivo en modo lectura
archivo = open('datos2.txt','r')  

# Mueve puntero al quinto byte
archivo.seek(5)  

# lee los siguientes 5 bytes
cadena1 = archivo.read(5) 

# Muestra cadena
print(cadena1) 

# Muestra posición del puntero 
print(archivo.tell())

# Cierra archivo
archivo.close  

Leer y escribir cualquier objeto a un archivo: pickle


Para leer y escribir cualquier tipo de objeto Python podemos importar el modulo pickle y usar sus métodos dump() y load() para leer y escribir los datos.

# Importa módulo pickle
import pickle

# Declara lista
lista = ['Perl', 'Python', 'Ruby']

# Abre archivo binario para escribir   
archivo = open('lenguajes.dat', 'wb')

# Escribe lista en archivo
pickle.dump(lista, archivo)

# Cierra archivo
archivo.close

# Borra de memoria la lista
del lista  

# Abre archivo binario para leer
archivo = open('lenguajes.dat', 'rb')

# carga lista desde archivo
lista = pickle.load(archivo)

# Muestra lista  
print(lista)

# Cierra archivo
archivo.close  


Relacionado: Tempfile: archivos y directorios temporales

Ir al índice del tutorial de Python

9 comentarios:

Neyer Canaviri dijo...

Muy bueno el manual, e buscado bastante tutoriales sobre Python 3 en español y solo encontraba informacion antigua Python 2.x e inferior.
Buen trabajo, esta muy claro.
Estoy por emprender un proyecto en Python, seguramente esta guia me sera de mucha utilidad.

Pherkad dijo...

Me alegra que sea de utilidad. Neyer, muchas gracias!

amimsped dijo...

muchas gracias, me es muy util.

Pherkad dijo...

Amimsped, muchas gracias por su visita! ;-)

Carlos Alberto Rodriguez Proenza dijo...

Soy nuevo en el aprendizaje de Python y estoy trabajando con la versión 3.6 usando Spyder3. Lo estoy aprendiendo dado que estoy realizando mi tesis de doctorado en física teórica, específicamente haciendo simulaciones númericas en el área de las nanociencias. Estoy usando por otro lado, un software de acceso libre en LINUX el cual me permite realizar dinámicas moléculares en sistemas atómicos y cuyo nombre es LAMMPS. Este programa, después de la realización de las simulaciones brinda como datos de salida diferentes tipos de archivos con extensiones .txt y .trajectory; es decir, son ficheros de datos. Estoy aprendiendo Python ya que necesito extraer la información de estos archivos para construir programas que me permitan calcular indicadores para poder explicar los resultados obstenidos en las simulaciones. Ya se como leer archivos y escribir en estos en Python.

Carlos Alberto Rodriguez Proenza dijo...

Tengo ficheros en los cuales se puede encontrar información como esta:

Líneas de texto que no me interesan
No. Átomo Energía Cinética Energía Potencial Presión Volumen
23 -34.456 -4567.56 3456 45677
677 -35.458 -6789.56 4567 5678
3 -45-678 -6789-34 6785 45678
: : : : :

Por poner un ejemplo ipotético. Me gustaría saber como poder acceder a esta información numérica que aparece encerrada en estas tablas para luego poder usarla para programar y hacer algunas gráficas como Energía Potencial vs Temperatura, etc.

Carlos Alberto Rodriguez Proenza dijo...

Le agradezco mucho de antemano cualquier ayuda al respuests o ayuda en este sentido por la importancia que tiene para el desarrollo de mi trabajo. Atentamente

Carlos.

Pherkad dijo...

Hola Carlos Alberto

No soy usuario de LAMMPS y no conozco los formatos que tienen los archivos que puede generar (CSV, XLM, etc). El formato de los datos que muestras a modo de ejemplo se parece a CSV, incluyendo un encabezado en la primera línea y los datos numéricos en las líneas sucesivas separados por un espacio en blanco. Si esa es la representación que suele dar a la información puedes utilizar el módulo CSV para leer la información: http://python-para-impacientes.blogspot.com.es/2015/05/operaciones-con-archivos-csv.html

También, puedes leer la lineas completas de los datos numéricos y generar listas con los datos con la función split() que puedes utilizar para crear los gráficos.

Para crear las representaciones gráficas consulta: http://python-para-impacientes.blogspot.com.es/2014/08/graficos-en-ipython.html

Habría más posibilidades, todo depende de los formatos que aplique LAMPPS a la información. También, es posible que existan conversores para pasar la información de un formato a otro.





Pedro Díaz dijo...

Enhorabuena por el estupendo manual. Muy bueno para empezar y avanzar en los conocimientos esenciales. También buenas prácticas.