Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
script:python:xtra [2011/09/24 11:22] alfred |
script:python:xtra [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 28: | Línea 28: | ||
| object.__setattr__(self, name, value) | object.__setattr__(self, name, value) | ||
| </code> | </code> | ||
| - | |||
| - | |||
| - | ==== Recoger el contenido de una web ==== | ||
| - | Para ello usaremos la función ''urlopen'' que está en el módulo ''urllib''. Excepto en el constructor, los métodos para usarlos son... | ||
| - | <code python> | ||
| - | import urllib | ||
| - | f = urlopen(’http://www.google.es’) | ||
| - | for linea in f: | ||
| - | print linea[:-1] | ||
| - | f.close() | ||
| - | </code> | ||
| - | |||
| Línea 153: | Línea 141: | ||
| - | ==== Decodificando datos binarios ==== | ||
| - | === Módulo binascii === | ||
| - | Existe el módulo ''binascii'' que trae distintas funciones para recoger los datos en un formato u otro: | ||
| - | <code python> | ||
| - | binascii.b2a_base64(data) | ||
| - | binascii.b2a_hex(data) | ||
| - | binascii.b2a_uu(data) | ||
| - | binascii.crc32(data, 0) | ||
| - | binascii.hexlify(data) | ||
| - | </code> | ||
| - | === Modulo array === | ||
| - | * [[http://docs.python.org/library/array.html]] | ||
| - | También podemos hacerlo mediante el módulo ''array'', este define un objeto con un tipo concreto (caracteres, integers, floats...) el cual se indica en la creación que es de la siguiente forma: | ||
| - | <code python> | ||
| - | import array | ||
| - | a = array.array('c', data) | ||
| - | </code> | ||
| - | Siendo el primer parámetro pasado (''c'' en este caso) el tipo que es. Los tipos se definen por (c (caracter a partir de un byte), b, B, u, h (short a partir de dos bytes), H, i (integer a partir de dos bytes), I, l (long a partir de cuatro bytes), L, f (float a partir de cuatro bytes), d (doubles a partir de cuatro bytes)). | ||
| - | === Modulo struct === | ||
| - | * [[http://docs.python.org/library/struct.html]] | ||
| - | Muy útil para la extracción de datos tipados de una cadena en bytes, y viceversa, pasar datos a cadena de bytes. \\ | ||
| - | Para recoger datos utilizamos la función ''unpack'' a la cual se le pasa un formato (que se forma a partir de los valores de la siguiente tabla) y la cadena de bytes: | ||
| - | ^ format ^ tipo leido ^ numero de bytes ^ | ||
| - | | c | char | 1 | | ||
| - | | b | byte | 1 | | ||
| - | | B | ubyte | 1 | | ||
| - | | h | short | 2 | | ||
| - | | H | ushort | 2 | | ||
| - | | i | int | 4 | | ||
| - | | I | uint | 4 | | ||
| - | | l | long | 4 | | ||
| - | | L | ulong | 4 | | ||
| - | | q | long (64b) | 8 | | ||
| - | | Q | ulong (64b) | 8 | | ||
| - | | f | float | ? | | ||
| - | | d | double | 8 | | ||
| - | | s | char[] | 1 | | ||
| - | | p | char[] | 1 | | ||
| - | Con este formato podríamos indicar qué es lo que viene en la cadena de bytes pasada, por ejemplo, ''cHIII'' esperaría a leer de los bytes un carácter, un unsigned short y tres unsigned int, es decir, la cadena de bytes debería de tener 11 bytes. El ejemplo también lo podríamos escribir como ''cH3I'', el resultado sería una lista. En el siguiente ejemplo se tiene un array de bytes (''data'') y se sabe que el primer es un número y el segundo un carácter. Luego también habría otro byte, pero este se imprimiría en la siguiente línea: | ||
| - | <code python> | ||
| - | print struct.unpack("Bc", data[:2]) | ||
| - | print struct.unpack("B", data[2:3]) | ||
| - | </code> | ||
| - | El primer carácter del formato puede indicar hacia donde se dirigen los bytes, por ejemplo puede ser: | ||
| - | * ''!'': Como se envia por red. | ||
| - | * ''<'': Little-endian. | ||
| - | * ''>'': Big-endian. | ||
| - | Otras funciones útiles podrían ser ''calcsize'' que pasándole un formato indica qué tamaño debería de tener este: | ||
| - | <code python> | ||
| - | >>> struct.calcsize('hhl') | ||
| - | 8 | ||
| - | </code> | ||
| - | O también podemos aprovechar el tipo ''namedtuple'' para crear objetos: | ||
| - | <code python> | ||
| - | >>> from collections import namedtuple | ||
| - | >>> Student = namedtuple('Student', 'name serialnum school gradelevel') | ||
| - | >>> Student._make(unpack('<10sHHb', data)) | ||
| - | Student(name='raymond ', serialnum=4658, school=264, gradelevel=8) | ||
| - | </code> | ||
| - | |||
| - | Y si quisieramos leer de un archivo binario... | ||
| - | <code python> | ||
| - | >>> import struct | ||
| - | >>> f = file('test.chm','r') | ||
| - | >>> s = f.read(4*1 + 3*4) | ||
| - | >>> struct.unpack("4s3I", s) | ||
| - | ('ITSF', 3L, 96L, 1L) | ||
| - | </code> | ||
| ===== Sockets ===== | ===== Sockets ===== | ||
| Línea 322: | Línea 242: | ||
| - | ===== Formatos de datos ===== | ||
| - | ==== XML ==== | ||
| - | Para trabajar con XML en Python es necesario importar: ''xml.dom.minidom''. Ahora podemos... | ||
| - | * Coger un archivo .xml: ''archivo = xml.dom.minidom.parse("archivo.xml")'' | ||
| - | * Mostrar código del archivo: ''archivo.toxml()'' | ||
| - | * Coger elementos por el nombre: ''elements = archivo.getElementsByTagName("name")'' | ||
| - | * Acceder a los nodos de un elemento: ''nodo = elements.item(0)'' | ||
| - | * Saber si un nodo tiene subnodos: ''nodo.hasChildNodes()'' | ||
| - | * Coger los dubnodos subnodos: ''subnds = nodo.childNodes'' | ||
| - | * Saber de un nodo... | ||
| - | * nombre: ''nodo.nodeName'' | ||
| - | * tipo: ''nodo.nodeType'' | ||
| - | * valor: ''nodo.nodeValue'' | ||
| - | * Coger atributos: ''attr = nodo.attributes'' | ||
| - | * Coger un atributo con el nombre tal: ''subn = attr.getNamedItem("tal")'' \\ | ||
| - | //Si llegas a un nodo que tiene un valor, del estilo <nombre>nom</nombre>, el nodo al que has llegado (nombre) tendrá como nodeName "nombre" pero None como nodeValue, para ello tendrás que coger sus "childNodes", entonces el primer elemento de los childNodes tendrá el nodeName a None, pero el nodeValue como "nom".// | ||
| - | * Para más información lee //"Python and XML - An introduction.pdf"// en la sección de [[script:python:docs#xml|documentos de xml]]. | ||
| - | * Existen librerías para el trato avanzado de XML, mira en la sección de [[otros:otros#lista_de_librerias_y_frameworks|librerías]]. | ||
| - | * {{script:python:pruebas_xml.zip|Ejemplos}} | ||
| - | |||
| - | ==== JSON ==== | ||
| - | A partir de la versión 2.6 de Python podemos utilizar un encoder\decoder de json en Python ([[http://docs.python.org/library/json.html]]). | ||
| - | |||
| - | ===== SQLite y Python ===== | ||
| - | * <html><a href="myfiles/script/python/sqlite_and_python.zip">Documentación de SQLite y Python</a></html> | ||
| - | Desde la versión 2.5 de Python podemos utilizar el módulo ''sqlite3'' el cual nos permite acceder a una base de datos sqlite3. \\ | ||
| - | |||
| - | ==== Acciones básicas ==== | ||
| - | === Conexión === | ||
| - | <code python> | ||
| - | import sqlite3 | ||
| - | db = sqlite.connect("c:\\prueba.db") | ||
| - | </code> | ||
| - | === Ejecución de sql === | ||
| - | <code python> | ||
| - | c = db.cursor() | ||
| - | c.execute("insert into data (id) values (1)") | ||
| - | db.commit() | ||
| - | </code> | ||
| - | === Ejecución de consulta === | ||
| - | <code python> | ||
| - | c = db.cursor() | ||
| - | c.execute("select * from data") | ||
| - | for row in c: | ||
| - | print row | ||
| - | </code> | ||
| - | === Funciones de un cursor === | ||
| - | |||
| - | * ''fetchall()'': Trae todo el resultado en una lista. | ||
| - | |||
| - | |||
| - | |||
| - | ==== Acciones avanzadas ==== | ||
| - | === Insertar una fecha === | ||
| - | <code python> | ||
| - | >>> t = time.localtime() | ||
| - | >>> ts = sqlite3.Timestamp(t[0], t[1], t[2], t[3], t[4], t[5]); | ||
| - | >>> c.execute ("insert into fecha (fecha) values (?)", (ts,)) | ||
| - | </code> | ||
| - | === Insertar un blob === | ||
| - | <code python> | ||
| - | query = u'''insert into data VALUES(?, ?)''' | ||
| - | c = db.cursor() | ||
| - | b = sqlite3.Binary(data) | ||
| - | c.execute(query,(id,b)) | ||
| - | db.commit() | ||
| - | </code> | ||