Está en la página 1de 13

Clase 10 (Sep 10, 2021)

Repaso
1. Apertura de un archivo con cierre automatizado (uso de with)
2. Existen más permisos de escritura/lectura ("r+", "w+", "a")
3. Las cadenas de caracteres tienen métodos especiales para trabajar con ellas.

In [1]: 1 # Carga de librerías útiles para esta libreta


2 import numpy as np
3 import matplotlib.pyplot as plt

Contar número de veces que el substring aparece en el string :


count
El método count nos dice cuántas veces aparece el substring dentro del string. Admite un
parámetro que es el substring a buscar, y opcionalmente otros dos, los índices de inicio y fin de
búsqueda.

cadena="Para hacer un pan necesita: harina, levadura, huevo, azúcar,


un horno, aceite o mantequilla."
print("La coma aparece %d veces en cadena: %s", %(cadena.count(",") ,
cadena ))

In [11]: 1 #Ejercicio: Escriba un código que cuente cuántas veces aparece


2 #la palabra ruinas en el texto de las ruinas circulares
3 ​
4 ​
5 ​

Reemplazar substring en string : replace


El método replace nos permite obtener una copia de la cadena original (no reemplaza en la
cadena original) en la que se reemplaza el substring que se le indique por uno nuevo. Admite
tres parámetros, el primero es el substring que tiene que buscar, el segundo es el nuevo
substring que tiene que poner y el tercero, opcional, es cuántas veces tiene que hacer el
reemplazo.

cadena="Pedrito fué a comprar un chetos"


cadena2=cadena.replace("chetos", "doritos")
print(cadena2)
Pruebe el código en la siguiente celda.

In [9]: 1 #Pruebe aquí su código


2 ​
3 ​
4 ​
5 ​
6 ​
7 # Ejercicio
8 cadena="Si miras al abismo, el abismo devuelve siempre la mirada. uuuuuuu
9 # Cree una cadena que cambie abismo por chabelo y mirada por catafixia
10 ​
11 ​

Método split
El método split genera una lista de los elementos separados por algún substring o caracter.

Ejemplo:

cadena_coma="1,3,4,5,7,8,9,10"
cadena_espacio="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20"
cadena_tab="1\t2\t3\t4\t5\t6\t7"
datos_coma=cadena_coma.split(",")
datos_espacio=cadena_espacio.split(" ")
datos_tab=cadena_tab.split("\t")
print(datos_coma)
print(datos_espacio)
print(datos_tab)

Pase este código a la celda siguiente

In [13]: 1 # Escriba aquí su código


2 ​
3 ​
4 ​
5 ​
6 ​
7 ## Adicionalmente, escriba un código que realice una separación
8 #de una cadena de datos separados por algún delimitador, por ejemplo:
9 #":" , ";", "\n", "#"
10 ​
11 ​
12 ​

Convertir número a string con formato


En python tenemos tres formas de conseguir un string en el que vayan formateados números y
otras variables. La forma antigua es usar el operador % el operador %

Se usa una expresión como la siguiente "string con formato" % valores. Veamos ejemplos
In [14]: 1 print ("Entero con 5 cifras, espacios por delante %5d" % 11) # saca tre
2 print ("Entero con 5 cifras, ceros por delante %05d" % 11) # saca 000
3 print ("Flotante con 2 decimales %.2f" % 12.34567) # saca 12.
4 print ("Flotante con 2 decimales, diez cifras, espacios por delante %10.2f
5 print ("Flotante con 2 decimales, diez cifras, ceros por delante %010.2f" %
6 ​

Entero con 5 cifras, espacios por delante 11


Entero con 5 cifras, ceros por delante 00011
Flotante con 2 decimales 12.35
Flotante con 2 decimales, diez cifras, espacios por delante 12.35
Flotante con 2 decimales, diez cifras, ceros por delante 0000012.35

In [ ]: 1 ​

In [ ]: 1 ​

Existen más métodos de la clase string, puede consultar estos en la documentación de


python:

https://docs.python.org/3/library/stdtypes.html#string-methods
(https://docs.python.org/3/library/stdtypes.html#string-methods)

In [ ]: 1 ​

Carga de archivos de datos


CSV
En general, la función loadtxt de numpy permite obtener el acceso directamente a archivos de
texto plano. Es decir, sin codificación. A los archivos con separación por una coma "," se les
suele llamar formato csv y por ende se les acostumbra a poner la terminación .csv en el
nombre. No obstante, la extensión, no implica necesariamente que el separador sea una coma.
Otros separadores son: ";" tab("\t"), ":", " ".

Los archivos csv son unos de los formatos más utilizados. Esto es debido a su facilidad de uso
y a que cualquier hoja de cálculo puede usar ese formato.

Cargar datos con numpy: loadtxt


Es posible cargar archivos directamente a un arreglo de numpy. Para ello, se requieren de
ciertas características. En esta sección nos ocuparemos solamente de archivos de datos:
Suponga que se tiene un archivo sin huecos y separado por comas, un ejemplo puede ser:

1,2,3,4,5 6,7,8,9,10 11,12,13,14,15 16,17,18,19,20

Dicho archivo puede cargarse con el comando loadtxt:


from numpy import loadtxt
A=loadtxt("Archivo_datos.csv", delimiter=',') #Note que solo requirió
del nombre del archivo y su separador.

In [15]: 1 help(np.loadtxt)
genfromtxt : Load data with missing values handled as specified.
scipy.io.loadmat : reads MATLAB data files

Notes
-----
This function aims to be a fast reader for simply formatted files. The
`genfromtxt` function provides more sophisticated handling of, e.g.,
lines with missing values.

.. versionadded:: 1.10.0

The strings produced by the Python float.hex method can be used as


input for floats.

Examples
--------
>>> from io import StringIO # StringIO behaves like a file object
>>> c = StringIO("0 1\n2 3")
>>> np.loadtxt(c)
array([[0., 1.],
[2 3 ]])
In [16]: 1 # El archivo Datos.csv contiene un datos en un arreglo de Ncolumnas y X
2 # renglones sin vacíos. No cabeceras,
3 # todo son números. Carguelo utilizando loadtxt.
4 ​
5 ​

In [17]: 1 # El archivo Datos_r.csv contiene un datos en un arreglo de Ncolumnas y


2 #X renglones sin vacíos. Cabeceras,
3 # Cargue las N-1 columnas utilizando loadtxt.
4 ​
5 ​
6 ​
7 ​
8 ​
9 ​
10 ​
In [13]: 1 # Ejemplo de carga de un archivo sin loadtxt:
2 total_len = 0
3 data2=[]
4 with open("Datos.csv") as fh:
5 for _, line in enumerate(fh):
6 data = line.split("\t")
7 data=[float(i) for i in data ]
8 data2.append(np.array(data))
9 # Podemos encapsular todo en un numpy array
10 data2=np.vstack(data2)
11 # Revisemos nuestro resultado
12 print("data 2 es de tipo: ", type(data2), "y tiene dimensiones: ", data2.s
13

data 2 es de tipo: <class 'numpy.ndarray'> y tiene dimensiones: (1000, 10)

In [ ]: 1 ​
2 ​
3 ​
4 ​

In [19]: 1 ## Ejercicio: Tenemos un archivo llamado TiemposNeuDPC1.csv. Cárguelo.


2 ​
3 ​
4 ​
5 ​
6 ​
7 ​

Archivos binarios con numpy: El formato npy


Es posible con numpy generar archivos binarios mediante la función save de numpy. Luego es
posible leerlos o cargarlos mediante la función load

A=np.random.rand(10, 5)
np.save("MiPrimerArchivonpy.npy", A)
In [20]: 1 help(np.save)
Help on function save in module numpy:

save(file, arr, allow_pickle=True, fix_imports=True)


Save an array to a binary file in NumPy ``.npy`` format.

Parameters
----------
file : file, str, or pathlib.Path
File or filename to which the data is saved. If file is a file-objec
t,
then the filename is unchanged. If file is a string or Path, a ``.np
y``
extension will be appended to the filename if it does not already
have one.
arr : array_like
Array data to be saved.
allow_pickle : bool, optional
Allow saving object arrays using Python pickles. Reasons for disallow
ing
pickles include security (loading pickled data can execute arbitrary
code) and portability (pickled objects may not be loadable on differe
nt
Python installations, for example if the stored objects require libra
ries
that are not available, and not all pickled data is compatible betwee
n
Python 2 and Python 3).
Default: True
fix_imports : bool, optional
Only useful in forcing objects in object arrays on Python 3 to be
pickled in a Python 2 compatible way. If `fix_imports` is True, pickl
e
will try to map the new Python 3 names to the old module names used i
n
Python 2, so that the pickle data stream is readable with Python 2.

See Also
--------
savez : Save several arrays into a ``.npz`` archive
savetxt, load

Notes
-----
For a description of the ``.npy`` format, see :py:mod:`numpy.lib.format`.

Any data saved to the file is appended to the end of the file.

Examples
--------
>>> from tempfile import TemporaryFile
>>> outfile = TemporaryFile()

>>> x = np.arange(10)
>>> np.save(outfile, x)

>>> _ = outfile.seek(0) # Only needed here to simulate closing & reopenin


g file
>>> np.load(outfile)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> with open('test.npy', 'wb') as f:


... np.save(f, np.array([1, 2]))
... np.save(f, np.array([1, 3]))
>>> with open('test.npy', 'rb') as f:
... a = np.load(f)
... b = np.load(f)
>>> print(a, b)
# [1 2] [1 3]

In [25]: 1 A=np.random.rand(10, 5)
2 np.save("Miprimerarchivo.npy", A)
3 # %ls Usa el comando mágico ls para corroborar la existencia

In [23]: 1 help(np.savez)
Arrays to save to the file. Since it is not possible for Python to
know the names of the arrays outside `savez`, the arrays will be sa
ved
with names "arr_0", "arr_1", and so on. These arguments can be any
expression.
kwds : Keyword arguments, optional
Arrays to save to the file. Arrays will be saved in the file with t
he
keyword names.

Returns
-------
None

See Also
--------
save : Save a single array to a binary file in NumPy format.
savetxt : Save an array to a file as plain text.
savez_compressed : Save several arrays into a compressed ``.npz`` archi
ve

In [26]: 1 B=np.random.rand(20, 5)
2 C=np.load("Miprimerarchivo.npy")
3 # Ahora guardemos múltiples arreglos:
4 np.savez("PruebaVariosArchivos.npz", B, C)
5 #%ls

In [27]: 1 # Ahora carguemos el archivo que acabamos de cargar


2 Archivos=np.load("PruebaVariosArchivos.npz")
3 print("Lo que hay dentro de Archivos es: ", Archivos.files)
4 #print("Lo que hay dentro de Archivos en Uno es: \n", Archivos["Uno"])
5 print("Lo guardado es lo mismo que lo leído? R: ", np.allclose(B, Archivos

Lo que hay dentro de Archivos es: ['arr_0', 'arr_1']


Lo guardado es lo mismo que lo leído? R: True
Es posible también indicar los nombres de las variables directamente:

In [30]: 1 D=np.random.rand(50, 5)
2 C=np.load("Miprimerarchivo.npy")
3 # Ahora guardemos múltiples arreglos:
4 datos={"Uno":D, "Dos":C, "Tres":B, "metadata": "Nada especial todo son pru
5 np.savez("PruebaVariosArchivosv2.npz", **datos)
6 #%ls

In [33]: 1 # Comprueba los archivos


2 Archivos2=np.load("PruebaVariosArchivosv2.npz")
3 print("Los archivos contenidos en Archivos2 son: ", Archivos2.files)
4 print("Es igual el archivo Uno? ", np.array_equal(D, Archivos2["Uno"]))
5 print("Es igual el archivo Dos? ", np.array_equal(C, Archivos2["Dos"]))
6 print("Es igual el archivo Tres? ", np.array_equal(B, Archivos2["Tres"]))

Los archivos contenidos en Archivos2 son: ['Uno', 'Dos', 'Tres', 'metadata']


Es igual el archivo Uno? True
Es igual el archivo Dos? True
Es igual el archivo Tres? True

Archivos pickle
Todas las variables cradas durante el tiempo de vida de un programa son temporalmente
almacenadas en la memoria y desaparecen cuando el programa o la sesión finaliza. Python
provee de un módulo para almacenar e invocar variables almacenadas en algún dispositivo: El
módulo Pickle4. Este módulo serializa la estructura de datos manejada por Python en un
formato de bits y la almacena en algún medio que se le indique. Además permite también leer
este archivo binario para convertirlo en la estructura original. De este modo, cuando se cargue
tal archivo será del tipo en que se había estado manejado anteriormente.

EL siguiente script genera un diccionario (sp_dict) y o guarda en un archivo (spdict.data):

import pickle #Carga la librería necesitada


sp_dict = {’one’:’uno’, ’two’:’dos’, ’three’:’tres’} #Crea el dicci
onario
with open(’spdict.data’, ’wb’) as fh:
pickle.dump(sp_dict, fh)

Con el método pickle.dump(), el diccionario sp_dict es almacenado en un archivo por medio de


la variable fh que maneja el archivo.

pickle.dump() acepta cuatro parámetros de entrada:

obj: el primero es el objeto que se quiere guardar,


fh: el segundo es la variable que hace referencia el archivo donde se almacenará.
Protocolo (opcional): Es un número entero que representa la froma en la cual la
información será codificada. El default es 3, el cual es un formato binario incompatible con
python 2.x.
fix_imports (opcional): Es un parámetro que cuando vale True y el Protocolo es menor
que 3, entonces se realizará una compatibilidad con Python2.x

Para leer un archivo se utiliza el métdo: pickle.load():

import pickle
pickle.load(open(’spdict.data’,’rb’)) # abre el archivo creado celda
s arriba.

El método load requiere la variable que maneja el archivo a abrir. Debe notarse que los
permisos son "rb" indicando que es de lectura binaria y "wb" indicadon que es la escritura d un
archivo binario. Si el archivo no es manipulado con estos permisos de archivo binario, resultará
en un error, y que python tratará de convertir los válores a Unicode.y to convert it to Unicode
and will fail.

Protocolos para el formato Pickle


A continuación se muestra una lista con los cinco diferentes protocolos que pueden usarse para
el guardado de variables. Entre más elevado se el valor, más reciente deberá ser la versión de
python para poder ser creado/leído:

0: Es el original fácilmente legible por humanos. Es compatible con las primeras versiones
de Python.
1: Es el formato binario antiguo, es compatible con versiones antiguas de Python.
2: Es mucho más eficiente en el codificado y compresión ademas de agregar nuevas
clases. Compatible con python 2.x
3: Es el default, tiene un soporte explícito para objetos binarios y no es compatile con
Python 2.x. Es el más recomendado si el uso será únicamente en las versiones de
Python3.x
4: Disponible a partir de la versión 3.4. Este protocolo soporta objetos más grandes que los
otros protocolos, además permite la conversión a pickle de más estructuras de datos que
los anteriores.

Adverencia: La conversión a formato pickle no es


segura con respecto a estructuras maliciosas que
pudieran afectar su dispositivo. Por ende, no lo utilice
para archivos de dudosa procedencia
Manejo de archivos: Módulos os y shutil
Además de leer y escrbir archivos, existen más maneras de manipularlos. El módulo os de
Python permite realizar operaciones realizadas más comúnmente con el sistema operativo.
Tales operaciones son: copiar archivos, moverlos, borrarlos, listarlos, cambiar de directorio, fijar
las propiedades del archivo, crear carpetas, etc.

En esta sección se verán solo algunas funciones del módulo os.


La primera función a revisar es la función getcw():

1. getcwd(): Devuelve una cadena de caracteres representando el directorio de trabajo


actual.

import os
os.getcwd()

2. chdir(path): Cambia el directoria actual al path

os.chdir(’..’)
os.getcwd()

3. listdir(dir): Devuelve una list conteniendo los nombres de las entradas en el directorio.
Para saber si un nombre regresado por listdir es un archivo o una carpeta (directorio), use
el comando: os.path.isdir() o os.path.isfile().

import os
archivos=os.listdir(os.getcwd())
print("Los elementos en este directorio son: \n", archivos)
print("\n¿Es ", archivos[1], "una carpeta?: ", os.path.isdir(archivos
[1]))
print("¿Es", archivos[1], "un archivo?: ", os.path.isfile(archivos
[1]))

4. remove(file): Borrael archivo file. El archivo debe existir y se deben tener permisos de
escritura sobre él.

os.remove("borrame.txt")

5. rename(source, destination): Renombra el archivo o directorio de source a destination

os.rename('/home/sb/seqs/readme.txt', '/home/sb/Readme')
mkdir(path): Create a directory named path.
os.mkdir(’/home/sb/processed-seqs’)

6. mkdir(path): Crea una carpeta llamada path.


os.mkdir(’/home/sb/processed-seqs’)

7. path.join(directory1,directory2,...): Une dos o más componentes de una ruta, en la unión


inserta el separador requerido para el sistema operativo. Por ejemplo, en Windows usará
un "" mientras que en Linux y OSX insertará "/". Esta función no verifica si el path creado es
válido.

os.path.join(os.getcwd(), "images")

8. path.exists(path): Verifica si la ruta especificada existe.

os.path.exists(os.path.join(os.getcwd(), "images"))

9. path.split(path): Devuelve una tupla separando el nombre del archivo o directorio al final
del resto de la ruta.

os.path.split(’/home/sb/seqs/ms2333.ab1’)
(’/home/sb/seqs’, ’ms2333.ab1’)

10. path.splitext(path): Exrae la extensión de un archivo. Este método devuelve una tupla con
la extensión adquirida mediante un punto.

os.path.splitext(’/home/sb/seqs/ms2333.ab1’)
(’/home/sb/seqs/ms2333’, ’.ab1’)

The shutil Module.


Algunas funciones útiles relacionadas con el manejo de archivos se encuentraen en otro
módulo: shutil. Las funciones más importantes son:

copy(source,destination): Copia el archivo source a la ubicación destination.


copy2(source,destination): Copia el archivo source a la ubicación destination. Este
comando, a diferencia del anterior copia también la información de la fecha/hora del último
acceso así como de la modificación más reciente.
copytree(source,destination): Copia de forma recursiva el árbol del directiorio entero del
directorio del archivo source a la dirección destination, este directorio no debe existir aún
para el uso de esta función.
Para mayor información, vea la documentación en: http://docs.python.org/lib/module-shutil.html

In [ ]: 1 import os
2 archivos=os.listdir(os.getcwd())
3 print("Los elementos en este directorio son: \n", archivos)
4 print("\n¿Es ", archivos[1], "una carpeta?: ", os.path.isdir(archivos[1])
5 print("¿Es", archivos[1], "un archivo?: ", os.path.isfile(archivos[1]))

In [ ]: 1 # Práctica, Haga una función que guarde una matriz aleatoria de 200 renglon
2 # Una vez que lo haya generado, lea el archivo utilizando la función loadtx
3 ​

También podría gustarte