Librería estándar

Librería estándar

Documentación

http://docs.python.org/3/library/index.html

Módulo sys

Ejercicio: cat

$ ./cat.py file.txt
This is the first line of the file
...
This is the last one

Pistas: sys.stdout

Ejercicio: grep

$ ./grep.py string file.txt
...string...

Pistas: sys.argv, open()

Opcional:

  • Especificar número de línea. Pista: enumerate()

    $ ./grep.py string file.txt
    Line 3: ...string...
    

Ejercicio: tee

$ 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

$ ./dice.py
5

Pistas: random.randint

Módulos pathlib

Ejercicio: find

$ ./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

$ ./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

>>> 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:

import re

REGEX = re.compile(
    '^(?P<major>(?:0|[1-9][0-9]*))'
    '\.(?P<minor>(?:0|[1-9][0-9]*))'
    '\.(?P<patch>(?:0|[1-9][0-9]*))'
    '(\-(?P<prerelease>[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?'
    '(\+(?P<build>[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*))?$'
)

Módulo datetime

Ejercicio: cumpleaños

$ ./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

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

Demo: SQLite (1)

>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> c = conn.cursor()
>>> # Create table
>>> c.execute('''CREATE TABLE stocks
...              (date text, trans text, symbol text, qty real, price real)''')
<sqlite3.Cursor object at 0x...>
>>> # Insert a row of data
>>> c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
<sqlite3.Cursor object at 0x...>
>>> # Save (commit) the changes
>>> conn.commit()

Demo: SQLite (2)

>>> # Placeholder to avoid sql injection
>>> t = ('RHAT',)
>>> c.execute('SELECT * FROM stocks WHERE symbol=?', t)
<sqlite3.Cursor object at 0x...>
>>> print(c.fetchone())
('2006-01-05', 'BUY', 'RHAT', 100.0, 35.14)
>>> # 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)
<sqlite3.Cursor object at 0x...>

Demo: SQLite (3)

>>> # 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.

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