================= Librería estándar ================= .. Repasar los módulos de la librería y estándar y explicar el uso de los más comunes para poder usarlos para resolver problemas. Explicar como se empaquetan e instalan módulos propios para poder distribuirlos e instalarlos en producción. Duración 6 horas Librería estándar ================= Documentación ------------- http://docs.python.org/3/library/index.html Módulo sys ========== Ejercicio: cat -------------- .. code:: $ ./cat.py file.txt This is the first line of the file ... This is the last one Pistas: ``sys.stdout`` Ejercicio: grep --------------- .. code:: $ ./grep.py string file.txt ...string... Pistas: ``sys.argv``, ``open()`` Opcional: - Especificar número de línea. Pista: ``enumerate()`` .. code:: $ ./grep.py string file.txt Line 3: ...string... Ejercicio: tee -------------- .. code:: $ cat.py file.txt | tee.py file2.txt This is the first line of the file ... This is the last one Pistas: ``sys.stdin`` Módulo random ============= Ejercicio: dice --------------- .. code:: $ ./dice.py 5 Pistas: ``random.randint`` Módulos pathlib =============== Ejercicio: find --------------- .. code:: $ ./find.py path pattern dir1/dir2/pattern.extension dira/xxxpattern.extension Pista: ``pathlib.Path.iterdir()`` o ``pathlib.Path.glob()`` =========== =================================================== ======== ================ ============ Comodín Resultado Ejemplo Encuentra No encuentra =========== =================================================== ======== ================ ============ ``*`` Cualquier conjunto de caracteres incluido _ninguno_ ca* ca, carro, casta caca ``?`` Cualquier carácter incluido ?oz coz, hoz oz, coza ``[abc]`` Alguno de los caracteres incluido en el conjunto no[ae] noa, noe noi ``[a-z]`` Alguno de los caracteres incluido en el rango 199[2-6] 1993, 1995, 1996 1991, 1997 =========== =================================================== ======== ================ ============ Módulo argparse =============== Ejercicio: -h/--help y --type ----------------------------- .. code:: $ ./find.py -h Usage: find.py [-h] [--type=EXT] pattern Buscar archivos. positional arguments: pattern optional arguments: -h, --help show this help message and exit --type EXT search EXT files Pista: ``argparse`` Módulo re ========= Ejercicio: *Semantic Versioning* -------------------------------- .. code:: python >>> assert parse_semver('1.0.11') == (1, 0, 11, None, None) >>> assert parse_semver('1.7.1-rc.1') == (1, 7, 1, 'rc.1', None) >>> assert parse_semver('3.14.7-100+x86_64') == (1, 0, 11, '100', 'x86_64') Pista: .. code:: python import re REGEX = re.compile( '^(?P(?:0|[1-9][0-9]*))' '\.(?P(?:0|[1-9][0-9]*))' '\.(?P(?:0|[1-9][0-9]*))' '(\-(?P[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?' '(\+(?P[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?$' ) Módulo datetime =============== Ejercicio: cumpleaños --------------------- .. code:: $ ./age.py Fecha de nacimiento> 01-01-1970 Día de la semana: jueves Edad: 50 años, 0 meses y 1 días Pistas: ``input()``, ``calendar.weekday()`` y ``datetime.date.today()`` Ejercicio: cumpleaños (2) ------------------------- Opcional: - Procesa esta tabla y calcula constelación .. doctest:: Aries 19 April – 13 May Taurus 14 May – 19 June Gemini 20 June – 20 July Cancer 21 July – 9 August Leo 10 August – 15 September Virgo 16 September – 30 October Libra 31 October – 22 November Scorpius 23 November – 29 November Ophiuchus 30 November – 17 December Sagittarius 18 December – 18 January Capricornus 19 January – 15 February Aquarius 16 February – 11 March Pisces 12 March – 18 April Pistas: ``.split()`` Python Database API Specification (PEP249_): ejemplo módulo sqlite3 ==================================================================== .. _PEP249: http://www.python.org/dev/peps/pep-0249/ Demo: SQLite (1) ---------------- .. doctest:: python >>> import sqlite3 >>> conn = sqlite3.connect(':memory:') >>> c = conn.cursor() .. doctest:: python >>> # Create table >>> c.execute('''CREATE TABLE stocks ... (date text, trans text, symbol text, qty real, price real)''') .. doctest:: python >>> # Insert a row of data >>> c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)") .. doctest:: python >>> # Save (commit) the changes >>> conn.commit() Demo: SQLite (2) ---------------- .. doctest:: python >>> # Placeholder to avoid sql injection >>> t = ('RHAT',) >>> c.execute('SELECT * FROM stocks WHERE symbol=?', t) >>> print(c.fetchone()) ('2006-01-05', 'BUY', 'RHAT', 100.0, 35.14) .. doctest:: python >>> # Larger example that inserts many records at a time >>> purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00), ... ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00), ... ('2006-04-06', 'SELL', 'IBM', 500, 53.00), ... ] >>> c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases) Demo: SQLite (3) ---------------- .. doctest:: python >>> # Iterator form >>> for row in c.execute('SELECT * FROM stocks ORDER BY price'): ... print(row) ... ... ('2006-01-05', 'BUY', 'RHAT', 100.0, 35.14) ('2006-03-28', 'BUY', 'IBM', 1000.0, 45.0) ('2006-04-06', 'SELL', 'IBM', 500.0, 53.0) ('2006-04-05', 'BUY', 'MSFT', 1000.0, 72.0) Módulo subprocess ================= Demo: Ejecuta programas externos -------------------------------- Ejecuta el comando `git pull` para actualizar el repositorio. .. doctest:: python import sys import subprocess args = ['git', 'pull'] with subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) as process: for line in process.stdout: text = str(line, encoding=sys.stdout.encoding) sys.stdout.write(text) if not process.returncode == 0: print('ERROR')