Diferencia entre revisiones de «Usuario:Lmorillas/intropyaytozgz/inmersionpython3»
De WikiEducator
(Página creada con '{{MiTitulo|Inmersión en Python :: 3}} == Ficheros == <source lang="python"> # viejo estilo fin = open("foo.txt") for linea in fin: # manipular linea fin.close() # mejor …') |
|||
(3 revisiones intermedias por el mismo usuario no mostrado) | |||
Línea 16: | Línea 16: | ||
</source> | </source> | ||
+ | <source lang="python"> | ||
+ | >>> 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 | ||
+ | |||
+ | </source> | ||
== Trabajando con archivos y directorios == | == Trabajando con archivos y directorios == | ||
+ | |||
+ | === ¿Existe un archivo o directorio? === | ||
+ | os.path.exists(ruta) | ||
=== Listado de archivos en un directorio === | === Listado de archivos en un directorio === | ||
Línea 166: | Línea 209: | ||
==== Quoting ==== | ==== Quoting ==== | ||
writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC) | writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC) | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
==== Usando nombres de campos ==== | ==== Usando nombres de campos ==== | ||
<source lang="python"> | <source lang="python"> | ||
Línea 226: | Línea 263: | ||
i += 1 | i += 1 | ||
wb.save('hoja.xls') | wb.save('hoja.xls') | ||
+ | </source> | ||
+ | |||
+ | |||
+ | == urllib == | ||
+ | Recuperar información | ||
+ | <source lang="python"> | ||
+ | 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 | ||
+ | </source> | ||
+ | |||
+ | Envío de parámetros por get | ||
+ | <source lang="python"> | ||
+ | import urllib, urllib2 | ||
+ | |||
+ | params = urllib.urlencode({"usuario": "manuel", "password": "contraseña"}) | ||
+ | f = urllib2.urlopen("http://ejemplo.com/login", params) | ||
+ | </source> | ||
+ | |||
+ | Uso de HttpBasicAuthHandler | ||
+ | <source lang="python"> | ||
+ | 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") | ||
+ | </source> | ||
+ | |||
+ | Otro ejemplo: | ||
+ | <source lang="python"> | ||
+ | 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() | ||
</source> | </source> |
Última revisión de 00:08 27 nov 2012
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()