13 - Curso de Python - Leer y escribir ficheros en python

From ChuWiki
Revision as of 21:43, 5 November 2012 by Chudiang (talk | contribs)
Jump to navigation Jump to search

Abrir y cerrar el fichero en python

En python los ficheros se abren con la función open(). Como primer parámetro se pasa el nombre del fichero y como segundo parámetro una cadena con caracteres similares a los de fopen() de C. Varios ejemplos:

  • Abrir fichero de lectura : f = open("fichero.txt")
  • Abrir fichero de lectura : f = open("fichero.txt", "r")
  • Abrir fichero de lectura en binario : f = open("fichero.txt", "rb")
  • Abrir fichero para escribir desde cero : f = open ("fichero.txt", "w")
  • Abrir fichero para añadir al final : f = open ("fichero.txt", "a")
  • etc, etc

Para cerrarlo, basta llamar a f.close()

$ python
Python 2.5.2 (r252:60911, Apr 21 2008, 11:12:42) 
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open("kk.txt")
>>> f
<open file 'kk.txt', mode 'r' at 0x8199650>
>>> f.close()
>>> f
<closed file 'kk.txt', mode 'r' at 0x8199650>
>>> 

Leer del fichero

Para leer del fichero, podemos usar las funciones f.read() y f.readline()

  • Lectura de todo el fichero de golpe : dato = f.read()
  • Lectura de 100 bytes : dato = f.read(100)
  • Lectura de una línea completa : dato = f.readline()
>>> f = open("kk.txt")
>>> f.read()
'hola\nmundo\n'
>>> f.close()
>>> f = open("kk.txt")
>>> dato = f.read(3)
>>> dato
'hol'
>>> f.close()
>>> f = open("kk.txt")
>>> dato = f.readline()
>>> dato
'hola\n'
>>> f.close()

Escribir en el fichero

Para escribir el fichero desde cero, machando su contenido si lo hubiera

>>> f=open("kk.txt","w")
>>> f.write("machacando\n")
>>> f.close()
>>> f=open("kk.txt")
>>> f.read()
'machacando\n'
>>> f.close()

Para escribir sobre un fichero existente, añadiendo al final

>>> f = open ("kk.txt", "a")
>>> f.write("tras tres tris\n")
>>> f.close()
>>> f=open("kk.txt")
>>> f.read()
'machacando\ntras tres tris\n'
>>> f.close()


Moviéndose por el fichero

Con f.tell() podemos saber en qué posición estamos del fichero y con f.seek() podemos desplazarnos por él, para leer o escribir en una determinada posición.

  • f.seek(n) : Ir al byte n del fichero
  • f.seek(n,0) : Equivalente al anterior
  • f.seek(n,1) : Desplazarnos n bytes a partir de la posición actual del fichero
  • f.seek(n,2) : Situarnos n bytes antes del final de fichero.

El segundo parámetro en estos ejemplos es

  • Ninguno o 0 : la posición es relativa al principio del fichero
  • 1 : la posición es relativa a la posición actual
  • 2 : la posición es relativa al final del fichero y hacia atrás.

Un ejemplo

>>> f = open ("pom.xml")
>>> f.seek(0,2)
>>> f.tell()
632L
>>> f.seek(625)
>>> f.read()
'oject>\n'
>>> f.close()

En el ejemplo abrimos un fichero pom.xml, con f.seek(0,2) nos situamos al final del fichero, f.tell() nos dice la posición en la que estamos, que coincide con el número de bytes del fichero puesto que estamos al final del mismo. Con f.seek(625) nos situamos en la posición 625 del fichero. Leemos hasta final del fichero con f.read() y cerramos el fichero.


Bucle para leer un fichero

A modo de ejemplo, el siguiente programa python abre un fichero y lo copia en otro

if __name__ == "__main__":
   f = open("origen.txt")
   g = open("destino.txt","w")
   for linea in f:
      g.write(linea)
   g.close()
   f.close()

Lo interesante aquí es el buclo "for linea in f". Esta es una forma de recorrer un fichero de texto, obteniendo una línea cada vez.

El fichero se puede leer con f.readLine() que nos da una línea cada vez, incluyendo el retorno de carro \n al final. Cuando lleguemos a final de fichero nos devolverá una linea vacía. Una línea en blanco en medio del fichero nos sería devuelta como un "\n", no como una línea vacía "". El siguiente ejemplo hace la copia del fichero leyendo con readline() y en un bucle hasta fin de fichero.

if __name__ == "__main__":
   f = open("origen.txt")
   g = open("destino.txt","w")
   linea = f.readline()
   while linea != "":
      g.write(linea)
      linea = f.readline()
   g.close()
   f.close()


Enlaces