Inmersión en Python :: 3
De WikiEducator
Contenido
Ficheros
# viejo estilo fin = open("foo.txt") for linea in fin: # manipular linea fin.close() # mejor with open('foo.txt') as fin: for linea in fin: # manipular linea
>>> f.read() 'Este es el archivo entero.\n' >>> f.read() '' >>> f.readline() 'Esta es la primer linea del archivo.\n' >>> f.readline() 'Segunda linea del archivo\n' >>> f.readline() '' >>> f.readlines() ['Esta es la primer linea del archivo.\n', 'Segunda linea del archivo\n'] >>> for linea in f: ... print linea, Esta es la primer linea del archivo Segunda linea del archivo >>> f = open('/tmp/archivodetrabajo', 'r+') >>> f.write('0123456789abcdef') >>> f.seek(5) # Va al sexto byte en el archivo >>> f.read(1) '5' >>> f.seek(-3, 2) # Va al tercer byte antes del final >>> f.read(1) 'd' >>> f.close() >>> f.read() Traceback (most recent call last): File "<stdin>", line 1, in ? ValueError: I/O operation on closed file
Trabajando con archivos y directorios
¿Existe un archivo o directorio?
os.path.exists(ruta)
Listado de archivos en un directorio
Para buscar todos los archivos con una extensión, por ejemplo .jpg:
import glob lista = glob.glob("*.jpg")
Para listar todos los archivos de un directorio:
import os ficheros = os.listdir('/home/alumno/ejercicios/python') # linux ficheros = os.listdir(r'c:\Documents and Settings\alumno\Escritorio\ejercicios\python') #windows: cuidado con el caracter \
Directorio actual:
os.getcwd() os.curdir
Tipos de ficheros
print michero, 'es un', if os.path.isfile(mifichero): print 'fichero' if os.path.isdir(mifichero): print 'directorio' if os.path.islink(mifichero): print 'enlace'
Último acceso a un fichero
ultimo_acceso = os.path.getatime('foto.jpg') ultima_modificacion = os.path.getmtime('foto.jpg') tiempo_en_dias = (time.time()- ultimo_acceso)/ (60*60*24) print tiempo_en_dias
Eliminar ficheros y directorios
os.remove('mifoto.jpg') for foto in glob.glob('*.jpg') + glob.glob('*.tif'): os.remove(foto)
Eliminar directorio:
import shutil shutil.rmtree('midirectorio')
Copiar y renombrar ficheros
import shutil shutil.copy(mifichero, copiafichero) # copia también tiempo de último acceso y última modificación shutil.copy2(mifichero, copiafichero) # copia un árbol de directorios shutil.copytree(raiz_de_directorio, copia_directorio)
Manipulando los paths y nombres
Rutas
>>> os.path.split('/home/alumno/python/ejercicios/ej1.py') ('/home/alumno/python/ejercicios', 'ej1.py') >>> os.path.basename('/home/alumno/python/ejercicios/ej1.py') 'ej1.py' >>> os.path.dirname('/home/alumno/python/ejercicios/ej1.py') '/home/alumno/python/ejercicios'
Extensiones
>>> os.path.splitext('pelicula.avi') ('pelicula', '.avi')
Crear y moverse entre directorios
directorioOriginal = os.getcwd() directorio = os.path.join(os.pardir, 'miNuevoDir') if not os.path.isdir(directorio): os.mkdir(directorio) os.chdir(directorio) ... os.chdir(directorioOriginal) # vuelve al directorio inicial os.chdir(os.environ['HOME']) # cambia al directorio home
Excepciones
try: f = open("file.txt") except IOError, e: # tratar excepción
Más complejo:
try: # código con riesgo except Exception, e: # captura excepción else: # si no ha saltado ninguna excepción finally: # ejecuta al final
Hojas de cálculo
Mucha información está almacenada en hojas de cálculo.
Ficheros CSV
La información de una hoja de cálculo se puede exportar/importar desde un fichero csv. Python tiene soporte para tratar ficheros csv. Un fichero csv es un fichero de texto.
Lectura
import csv with open('zaragoza_2010_10.csv') as fin: reader = csv.reader(fin, delimiter=";") for fila in reader: print fila
['Países', 'HOMBRES', 'MUJERES', 'TOTAL'] ['Rumania', '16704', '14487', '31191'] ['Ecuador', '5612', '5713', '11325'] ['Marruecos', '5042', '3007', '8049']
Escritura
with open('codigo_ascii.txt', 'w') as fout: writer = csv.writer(fout) ascii_a = ord('a') for n in range(26): writer.writerow((chr(ascii_a+n), ascii_a + n))
Quoting
writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC)
Usando nombres de campos
with open('zaragoza_2010_10.csv') as fin: # cuidado, toma la primera fila como títulos # usad parámetro fieldnames si no reader = csv.DictReader(fin, delimiter=";")
Hojas de cálculo Excel
Algunas librerías interesantes:
- xlrd
- http://pypi.python.org/pypi/xlrd
- Lee datos y formato de ficheros .xls
- Documentación de la API: https://secure.simplistix.co.uk/svn/xlrd/trunk/xlrd/doc/xlrd.html
- xlwt
- http://pypi.python.org/pypi/xlwt
- Escribe datos y formatos a ficheros .xls
- Doc: https://secure.simplistix.co.uk/svn/xlwt/trunk/xlwt/doc/xlwt.html
- Ejemplos: https://secure.simplistix.co.uk/svn/xlwt/trunk/xlwt/examples/
- xlutils
- http://pypi.python.org/pypi/xlutils
- Colección de utilidades que usan xlrd y xlwt:
- Doc y ejemplos: https://secure.simplistix.co.uk/svn/xlutils/trunk/xlutils/docs/
Sin embargo es necesario usar COM para :
- manipular gráficos
- celdas con texto enriquecido
- leer fórmulas
- trabajar con macros y nombres
xlrd
# ejemplo lectura import xlrd datos = {} # Dicc. vacío book = xlrd.open_workbook('sampledata.xls') hoja = book.sheet_by_index(0) for i in range(1,sh.nrows): #salta la primera línea datos[hoja.cell_value(rowx=i, colx=1)] = hoja.cell_value(rowx=i, colx=2)
xlwt
# ejemplo escritura import xlwt lista1 = [1,2,3,4,5] lista2 = [234,267,281,301,331] wb = xlwt.Workbook() ws = wb.add_sheet('Primera hoja') ws.write(0,0,'Column A') ws.write(0,1,'Column B') i = 1 for x,y in zip(lista1,lista2): # Recorre las dos listas a la vez ws.write(i,0,x) # Fila, Columna, Datos. ws.write(i,1,y) i += 1 wb.save('hoja.xls')
urllib
Recuperar información
import urllib2 try: f = urllib2.urlopen("http://www.python.org") print f.read() f.close() except HTTPError, e: print "Ocurrió un error" print e.code except URLError, e: print "Ocurrió un error" print e.reason
Envío de parámetros por get
import urllib, urllib2 params = urllib.urlencode({"usuario": "manuel", "password": "contraseña"}) f = urllib2.urlopen("http://ejemplo.com/login", params)
Uso de HttpBasicAuthHandler
aut_h = urllib2.HTTPBasicAuthHandler() aut_h.add_password("realm", "host", "usuario", "password") opener = urllib2.build_opener(aut_h) urllib2.install_opener(opener) f = urllib2.urlopen("http://www.python.org")
Otro ejemplo:
import urllib2 import getpass import sys proxyuser=raw_input("Ingrese usuario:") proxypass= getpass.getpass("Enter proxy password:") httpproxy=raw_input("Ingrese la direccion del proxy:") proxy=urllib2.ProxyHandler({"http":'http://'+proxyuser+':'+proxypass+'@'+httpproxy}) authinfo=urllib2.HTTPBasicAuthHandler() opener=urllib2.build_opener(proxy, authinfo,urllib2.HTTPHandler) urllib2.install_opener(opener) web=raw_input("Web es http://") userAgent = 'NuestroNavegador' headers = { 'User-Agent' : userAgent } req = urllib2.Request("http://"+web , None, headers) response = urllib2.urlopen(req) print response.read() response.close()