Python3 Entrada y salida

En los capítulos anteriores, ya hemos entrado en contacto con las funciones de entrada y salida de Python. En este capítulo presentaremos en detalle la entrada y salida de Python.


Embellecer el formato de salida

Python tiene dos formas de generar valores de salida: las sentencias de expresión y la función print().

La tercera forma es utilizar el método write() del objeto de archivo; el archivo de salida estándar se puede referenciar con sys.stdout.

Si deseas que la salida tenga formas más variadas, puedes usar la función str.format() para formatear los valores de salida.

Si deseas convertir los valores de salida en cadenas, puedes usar las funciones repr() o str().

  • str():La función devuelve una representación legible para el usuario.
  • repr():Produce una representación legible para el intérprete.

Por ejemplo

>>> s = 'Hello, Ejemplo'
>>> str(s)
'Hello, Ejemplo'
>>> repr(s)
"'Hello, Ejemplo'"
>>> str(1/7)
'0.14285714285714285'
>>> x = 10 * 3.25
>>> y = 200 * 200
>>> s = 'El valor de x es: ' + repr(x) + ', el valor de y es:' + repr(y) + '...'
>>> print(s)
El valor de x es:32.5,El valor de y es:40000...
>>> # La función repr() puede escapar los caracteres especiales en una cadena
... hello = 'hello, ejemplo\n'
>>> hellos = repr(hello)
>>> print(hellos)
'hello, ejemplo\n'
>>> # El argumento de repr() puede ser cualquier objeto de Python
... repr((x, y, ('Google', 'Ejemplo')))
"(32.5, 40000, ('Google', 'Ejemplo'))"

Aquí hay dos maneras de generar una tabla de cuadrados y cubos:

>>> for x in range(1, 11):
...     print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ')
...     # Observa el uso de 'end' en la línea anterior
...     print(repr(x*x*x).rjust(4))
...
 1   1    1
 2   4    8
 3   9   27
 4  16   64
 5  25  125
 6  36  216
 7  49  343
 8  64  512
 9  81  729
10 100 1000

>>> for x in range(1, 11):
...     print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))
...
 1   1    1
 2   4    8
 3   9   27
 4  16   64
 5  25  125
 6  36  216
 7  49  343
 8  64  512
 9  81  729
10 100 1000

Nota:En el primer ejemplo, los espacios entre columnas son añadidos por print().

Este ejemplo muestra el método rjust() de los objetos de cadena, que puede alinear la cadena a la derecha y rellenar con espacios a la izquierda.

También hay métodos similares, como ljust() y center(). Estos métodos no escriben nada, solo devuelven nuevas cadenas.

Otro método es zfill(), que rellena con ceros a la izquierda de un número, como se muestra a continuación:

>>> '12'.zfill(5)
'00012'
>>> '-3.14'.zfill(7)
'-003.14'
>>> '3.14159265359'.zfill(5)
'3.14159265359'

El uso básico de str.format() es el siguiente:

>>> print('{}sitio web: "{}!"'.format('Ejemplo', 'www.example.com'))
Sitio web de Ejemplo:"www.example.com!"

Los corchetes y los caracteres que contienen (llamados campos de formato) serán reemplazados por los argumentos en format().

Los números entre corchetes se utilizan para señalar la posición de los objetos pasados en format(), como se muestra a continuación:

>>> print('{0} y {1}'.format('Google', 'Ejemplo'))
Google y Ejemplo
>>> print('{1} y {0}'.format('Google', 'Ejemplo'))
Ejemplo y Google

Si en format() se utilizan argumentos de palabra clave, sus valores apuntarán a los argumentos que usan ese nombre.

>>> print('{name} sitio web: {site}'.format(name='Ejemplo', site='www.example.com'))
Sitio web de Ejemplo: www.ejemplo.com

Los argumentos posicionales y de palabra clave se pueden combinar arbitrariamente:

>>> print('Lista de sitios {0}, {1}, y {other}.'.format('Google', 'Ejemplo', other='Taobao'))
Lista de sitios Google, Ejemplo,y Taobao.

!a(usandoascii()), !s(usandostr()) y!r(usando repr()) se puede usar para convertir un valor antes de formatearlo:

>>> import math
>>> print('El valor de la constante PI es aproximadamente: {}.'.format(math.pi))
El valor de la constante PI es aproximadamente:3.141592653589793。
>>> print('El valor de la constante PI es aproximadamente: {!r}.'.format(math.pi))
El valor de la constante PI es aproximadamente:3.141592653589793。

La opción:y el especificador de formato pueden seguir al nombre del campo. Esto permite formatear el valor de una mejor manera. El siguiente ejemplo redondea Pi a tres decimales:

>>> import math
>>> print('El valor de la constante PI es aproximadamente {0:.3f}.'.format(math.pi))
El valor de la constante PI es aproximadamente3.142。

En:Después se pasa un entero, que puede garantizar que el campo tenga al menos ese ancho. Es muy útil para embellecer tablas.

>>> table = {'Google': 1, 'Ejemplo': 2, 'Taobao': 3}
>>> for name, number in table.items():
...     print('{0:10} ==> {1:10d}'.format(name, number))
...
Google     ==>          1
Ejemplo     ==>          2
Taobao     ==>          3

Si tienes una cadena de formato muy larga y no quieres dividirla, entonces es bueno formatear mediante nombres de variables en lugar de posiciones.

La forma más sencilla es pasar un diccionario y luego usar corchetes[]para acceder a los valores de las claves:

>>> table = {'Google': 1, 'Ejemplo': 2, 'Taobao': 3}
>>> print('Ejemplo: {0[Ejemplo]:d}; Google: {0[Google]:d}; Taobao: {0[Taobao]:d}'.format(table))
Ejemplo: 2; Google: 1; Taobao: 3

También se puede, usando delante de la variable table,**lograr la misma función:

>>> table = {'Google': 1, 'Ejemplo': 2, 'Taobao': 3}
>>> print('Ejemplo: {Ejemplo:d}; Google: {Google:d}; Taobao: {Taobao:d}'.format(**table))
Ejemplo: 2; Google: 1; Taobao: 3

Formato de cadenas a la antigua

%El operador % también puede realizar el formato de cadenas. Toma el argumento de la izquierda como unasprintf()cadena de formato al estilo de sprintf, y sustituye el lado derecho, luego devuelve la cadena formateada. Por ejemplo:

>>> import math
>>> print('El valor de la constante PI es aproximadamente: %5.3f.' % math.pi)
El valor de la constante PI es aproximadamente:3.142。

Debido a que str.format() es una función relativamente nueva, la mayoría del código Python todavía usa el operador %. Pero como este formato antiguo finalmente será eliminado del lenguaje, se debería usar más str.format().


Leer entrada desde el teclado

Python proporcionala función incorporada input()Lee una línea de texto desde la entrada estándar; la entrada estándar por defecto es el teclado.

Ejemplo

#!/usr/bin/python3

str = input("Por favor, introduce:");
print ("El contenido que ingresaste es: ", str)

Esto produce el siguiente resultado correspondiente a la entrada:

Por favor ingresa: Ejemplo

Leer y escribir archivos

En Python, las operaciones de archivo se realizan medianteopen()la función open(). Esta función devuelve un objeto de archivo (file object) para operaciones posteriores de lectura o escritura.

open()La sintaxis básica es la siguiente:

open(filename, mode)
  • filename:La ruta del archivo a acceder (cadena).
  • mode:El modo de apertura del archivo, utilizado para especificar la forma de lectura/escritura (como solo lectura, escritura, adición, etc.). Este parámetro es opcional, el valor por defecto esr(solo lectura).

Los modos de apertura de archivo comunes son los siguientes (se recomienda dominar r / w / a):

Modo Descripción
r Abre el archivo en modo solo lectura (modo predeterminado); el archivo debe existir, y el puntero del archivo se encuentra al principio.
rb Abre el archivo en formato binario solo lectura (como imágenes, videos, etc.); el puntero del archivo se encuentra al principio.
r+ Abre el archivo en modo lectura/escritura; el archivo debe existir, y el puntero del archivo se encuentra al principio.
rb+ Abre el archivo en formato binario lectura/escritura; el puntero del archivo se encuentra al principio.
w Abre el archivo en modo solo escritura. Si el archivo existe, serátruncado; si no existe, se crea un nuevo archivo.
wb Abre el archivo en formato binario solo escritura. Si el archivo existe será truncado; si no existe, se crea un nuevo archivo.
w+ Abre el archivo en modo lectura/escritura. Si el archivo existe será truncado; si no existe, se crea un nuevo archivo.
wb+ Abre el archivo en formato binario lectura/escritura. Si el archivo existe será truncado; si no existe, se crea un nuevo archivo.
a Abre el archivo en modo adición (append). Si el archivo existe, el contenido se añadirá al final; si no existe, se crea un nuevo archivo.
ab Abre el archivo en formato binario para añadir escritura; el contenido se añadirá al final; si no existe, se crea un nuevo archivo.
a+ Abre el archivo en modo lectura/escritura; el puntero del archivo está al final por defecto (modo adición); si no existe, se crea un nuevo archivo.
ab+ Abre el archivo en formato binario lectura/escritura; el puntero del archivo está al final por defecto; si no existe, se crea un nuevo archivo.

Nota:Añadiendo después del modobindica operar el archivo en modo binario, comúnmente utilizado para procesar archivos no textuales como imágenes, audio, etc.

La siguiente figura resume muy bien estos modos:

Modo r r+ w w+ a a+
Leer + + + +
Escribir + + + + +
Creación + + + +
Sobrescribir + +
Puntero al inicio + + + +
Puntero al final + +

El siguiente ejemplo escribe una cadena en el archivo foo.txt:

Ejemplo

#!/usr/bin/python3

# Abrir un archivo
f = open("/tmp/foo.txt", "w")

f.write( "Python es un lenguaje muy bueno.\nSí, de verdad es muy bueno!!\n" )

# Cerrar el archivo abierto
f.close()
  • El primer parámetro es el nombre del archivo que se va a abrir.
  • El segundo parámetro describe los caracteres que utiliza el archivo. mode puede ser 'r' si el archivo es de solo lectura, 'w' solo para escritura (si existe un archivo con el mismo nombre, se eliminará), y 'a' para añadir contenido al archivo; cualquier dato escrito se añadirá automáticamente al final. 'r+' se usa tanto para lectura como para escritura. El parámetro mode es opcional; 'r' será el valor predeterminado.

En este momento, al abrir el archivo foo.txt, se muestra lo siguiente:

$ cat /tmp/foo.txt 
Python 是一个非常好的语言。
是的,的确非常好!!

Métodos del objeto de archivo

Los ejemplos restantes de esta sección asumen que ya se ha creado un objeto de archivo llamado f.

f.read()

Para leer el contenido de un archivo, llame a f.read(size), que leerá una cierta cantidad de datos y luego los devolverá como una cadena u objeto de bytes.

size es un parámetro numérico opcional. Cuando se omite size o es negativo, se leerá y devolverá todo el contenido del archivo.

El siguiente ejemplo asume que el archivo foo.txt ya existe (creado en el ejemplo anterior):

Ejemplo

#!/usr/bin/python3

# Abrir un archivo
f = open("/tmp/foo.txt", "r")

str = f.read()
print(str)

# Cerrar el archivo abierto
f.close()

Al ejecutar el programa anterior, el resultado es:

Python 是一个非常好的语言。
是的,的确非常好!!

f.readline()

f.readline() leerá una sola línea del archivo. El carácter de nueva línea es '\n'. Si f.readline() devuelve una cadena vacía, significa que ya se ha leído la última línea.

Ejemplo

#!/usr/bin/python3

# Abrir un archivo
f = open("/tmp/foo.txt", "r")

str = f.readline()
print(str)

# Cerrar el archivo abierto
f.close()

Al ejecutar el programa anterior, el resultado es:

Python 是一个非常好的语言。

f.readlines()

f.readlines() devolverá todas las líneas contenidas en el archivo.

Si se establece el parámetro opcional sizehint, se leerán bytes de la longitud especificada y estos bytes se dividirán en líneas.

Ejemplo

#!/usr/bin/python3

# Abrir un archivo
f = open("/tmp/foo.txt", "r")

str = f.readlines()
print(str)

# Cerrar el archivo abierto
f.close()

Al ejecutar el programa anterior, el resultado es:

['Python 是一个非常好的语言。\n', '是的,的确非常好!!\n']

Otra forma es iterar sobre un objeto de archivo y luego leer cada línea:

Ejemplo

#!/usr/bin/python3

# Abrir un archivo
f = open("/tmp/foo.txt", "r")

for line in f:
    print(line, end='')

# Cerrar el archivo abierto
f.close()

Al ejecutar el programa anterior, el resultado es:

Python 是一个非常好的语言。
是的,的确非常好!!

Este método es muy simple, pero no proporciona un buen control. Como los mecanismos de procesamiento de ambos son diferentes, es mejor no mezclarlos.

f.write()

f.write(string) escribirá string en el archivo y luego devolverá el número de caracteres escritos.

Ejemplo

#!/usr/bin/python3

# Abrir un archivo
f = open("/tmp/foo.txt", "w")

num = f.write( "Python es un lenguaje muy bueno.\nSí, ciertamente muy bueno!!\n" )
print(num)
# Cerrar el archivo abierto
f.close()

Al ejecutar el programa anterior, el resultado es:

29

Si desea escribir algo que no sea una cadena, primero necesitará convertirlo:

Ejemplo

#!/usr/bin/python3

# Abrir un archivo
f = open("/tmp/foo1.txt", "w")

value = ('www.example.com', 14)
s = str(value)
f.write(s)

# Cerrar el archivo abierto
f.close()

Al ejecutar el programa anterior, abra el archivo foo1.txt:

$ cat /tmp/foo1.txt 
('www.example.com', 14)

f.tell()

f.tell() se utiliza para devolver la posición actual de lectura/escritura del archivo (es decir, la posición del puntero del archivo). El puntero del archivo representa el desplazamiento en bytes desde el inicio del archivo. f.tell() devuelve un entero que indica la posición actual del puntero del archivo.

f.seek()

Si desea cambiar la posición actual del puntero del archivo, puede usar la función f.seek(offset, from_what).

f.seek(offset, whence) se utiliza para mover el puntero del archivo a la posición especificada.

offset representa el desplazamiento relativo al parámetro whence. El valor de from_what: si es 0, indica el principio; si es 1, indica la posición actual; si es 2, indica el final del archivo. Por ejemplo:

  • seek(x,0): mover x caracteres desde la posición inicial, es decir, desde el primer carácter de la primera línea del archivo.
  • seek(x,1): significa mover x caracteres hacia adelante desde la posición actual.
  • seek(-x,2): significa mover x caracteres hacia atrás desde el final del archivo.

El valor de from_what es 0 por defecto, es decir, el inicio del archivo. A continuación se muestra un ejemplo completo:

>>> f = open('/tmp/foo.txt', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5)     # Mover al sexto byte del archivo
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2) # Mover al tercer byte desde el final del archivo
13
>>> f.read(1)
b'd'

f.close()

En archivos de texto (aquellos cuyo modo de apertura no incluye b), el posicionamiento solo se realiza relativo al inicio del archivo.

Cuando haya terminado de procesar un archivo, llame a f.close() para cerrar el archivo y liberar los recursos del sistema. Si intenta usar ese archivo de nuevo, se lanzará una excepción.

>>> f.close()
>>> f.read()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ValueError: I/O operation on closed file

Cuando se trabaja con un objeto de archivo, usar la palabra clave with es una muy buena opción. Al final, se encargará de cerrar el archivo correctamente. Además, su escritura es más corta que un bloque try - finally:

>>> with open('/tmp/foo.txt', 'r') as f:
...     read_data = f.read()
>>> f.closed
True

Los objetos de archivo tienen otros métodos, como isatty() y trucate(), pero normalmente se usan con menos frecuencia.


Módulo pickle

El módulo pickle de Python implementa la serialización y deserialización básica de datos.

Mediante la operación de serialización del módulo pickle, podemos guardar la información de los objetos que se ejecutan en el programa en un archivo para su almacenamiento permanente.

Mediante la operación de deserialización del módulo pickle, podemos crear a partir del archivo los objetos guardados por el programa anterior.

Interfaz básica:

pickle.dump(obj, file, [,protocol])

Con este objeto pickle, se puede abrir el archivo en modo lectura:

x = pickle.load(file)

Nota:Lee una cadena del archivo y la reconstruye como el objeto original de Python.

file:Objeto similar a un archivo, con interfaces read() y readline().

Ejemplo 1

#!/usr/bin/python3
import pickle

# Usar el módulo pickle para guardar los objetos de datos en un archivo
data1 = {'a': [1, 2.0, 3, 4+6j],
         'b': ('string', u'Unicode string'),
         'c': None}

selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)

output = open('data.pkl', 'wb')

# Pickle dictionary using protocol 0.
pickle.dump(data1, output)

# Pickle the list using the highest protocol available.
pickle.dump(selfref_list, output, -1)

output.close()

Ejemplo 2

#!/usr/bin/python3
import pprint, pickle

# Usar el módulo pickle para reconstruir los objetos de Python desde el archivo
pkl_file = open('data.pkl', 'rb')

data1 = pickle.load(pkl_file)
pprint.pprint(data1)

data2 = pickle.load(pkl_file)
pprint.pprint(data2)

pkl_file.close()
Otras extensiones