Diferencia entre revisiones de «Usuario:Lmorillas/intropyaytozgz/inmersionpython3»

De WikiEducator
Saltar a: navegación, buscar
(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)
==== Dialectos ====
 
>>> csv.list_dialects()
 
['excel-tab', 'excel']
 
 
Se pueden crear dialectos:
 
csv.register_dialect(nombre, delimiter="|")
 
 
==== 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


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:

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()