# Archivos en Python
import csv
import json
import pandas as pd
import matplotlib.pyplot as plt
class Pokemon:
# Type hints: herramientas como mypy
# (11, "metapod", 0.7, 9.9, "bicho") # pokemon putativo
def __init__ ( self ,
nid: int = 11 ,
nombre: str = "metapod" ,
altura: float = 0.7 ,
peso: float = 9.9 ,
tipo: str = "bicho" ) :
self ._nid = nid
self ._nombre = nombre
self ._altura = altura
self ._peso = peso
self ._tipo = tipo
def to_list( self ) :
return [
self ._nid,
self ._nombre,
self ._altura,
self ._peso,
self ._tipo]
def __str__ ( self ) :
return f"{self._nid}/{self._nombre}: {self._altura} m. {self._peso} kg." \
+ f" -- {self._tipo}"
def crea_pokemons( ) :
return [
Pokemon( 1 , "bulbosaur" , 0.7 , 6.9 , "planta" ) ,
Pokemon( 25 , "pikachu" , 0.4 , 6.0 , "eléctrico" ) ,
Pokemon( 26 , "raichu" , 0.8 , 30.0 , "eléctrico" ) ,
Pokemon( 257 , "blaziken" , 1.9 , 52.0 , "fuego" ) ,
]
def guarda_pokemons_txt( pokemons: list [ Pokemon] ) :
with open ( "pokemons.txt" , "wt" , encoding= "utf-8" ) as f:
for p in pokemons:
print ( str ( p) , file = f)
#f.write(str(p) + "\n")
def recupera_archivo_pokemons_txt( nf: str ) :
with open ( nf, "rt" ) as f:
for linea in f:
print ( linea.strip ( ) )
def guarda_pokemons_csv( pokemons: list [ Pokemon] ) :
with open ( "pokemons.csv" , "wt" , encoding= "utf-8" ) as f:
print ( "nid,nombre,altura,peso,tipo" , file = f)
w = csv .writer ( f)
for p in pokemons:
w.writerow ( p.to_list ( ) )
def guarda_pokemons_json( pokemons: list [ Pokemon] ) :
pokemon_dicts = [ p.__dict__ for p in pokemons]
with open ( "pokemons.json" , "wt" , encoding= "utf-8" ) as f:
json.dump ( pokemon_dicts, f)
def recupera_archivo_pokemons_json( nf: str ) -> list [ Pokemon] :
toret: list [ Pokemon] = [ ]
with open ( nf, "rt" ) as f:
pokemon_dicts = json.load ( f)
for pd in pokemon_dicts:
p = Pokemon( )
p.__dict__ = pd
toret.append ( p)
return toret
def recupera_archivo_pokemons_csv( nf: str ) -> list [ Pokemon] :
toret: list [ Pokemon] = [ ]
with open ( nf, "rt" ) as f:
r = csv .DictReader ( f)
for linea in r:
toret.append (
Pokemon(
int ( linea[ "nid" ] ) ,
linea[ "nombre" ] ,
float ( linea[ "altura" ] ) ,
float ( linea[ "peso" ] ) ,
linea[ "tipo" ] ) )
return toret
def crea_archivo_pokemons_txt( ) :
pokemons = crea_pokemons( )
guarda_pokemons_txt( pokemons)
def lee_archivo_pokemons_txt( ) :
recupera_archivo_pokemons_txt( "pokemons.txt" )
def crea_archivo_pokemons_csv( ) :
pokemons = crea_pokemons( )
guarda_pokemons_csv( pokemons)
def lee_archivo_pokemons_csv( ) :
pokemons = recupera_archivo_pokemons_csv( "pokemons.csv" )
for p in pokemons:
print ( p)
def lee_archivo_pokemons_json( ) :
pokemons = recupera_archivo_pokemons_json( "pokemons.json" )
for p in pokemons:
print ( p)
def crea_archivo_pokemons_json( ) :
pokemons = crea_pokemons( )
guarda_pokemons_json( pokemons)
def lee_archivo_pokemons_csv_pandas( ) :
dfp: pd.DataFrame = pd.read_csv ( "pokemons.csv" )
print ( "Todos los pokemons\n " , dfp)
df_nombre_peso = dfp[ [ "nombre" , "peso" ] ]
print ( "Todos los pokemons (nombre y peso)\n " , df_nombre_peso)
print ( "Todos los pokemons (nombre)\n " , dfp[ [ "nombre" ] ] )
dfp.altura .hist ( )
plt.xlabel ( "Alturas" )
plt.ylabel ( "Cuántos" )
plt.show ( )
def main( ) :
# crea_archivo_pokemons_txt()
# lee_archivo_pokemons_txt()
# crea_archivo_pokemons_csv()
# lee_archivo_pokemons_csv()
# crea_archivo_pokemons_json()
# lee_archivo_pokemons_json()
lee_archivo_pokemons_csv_pandas( )
if __name__ == "__main__" :
main( )
IyBBcmNoaXZvcyBlbiBQeXRob24KCgppbXBvcnQgY3N2CmltcG9ydCBqc29uCmltcG9ydCBwYW5kYXMgYXMgcGQKaW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdAoKCmNsYXNzIFBva2Vtb246CiAgICAjIFR5cGUgaGludHM6IGhlcnJhbWllbnRhcyBjb21vIG15cHkKICAgICMgKDExLCAibWV0YXBvZCIsIDAuNywgOS45LCAiYmljaG8iKSAgICMgcG9rZW1vbiBwdXRhdGl2bwogICAgZGVmIF9faW5pdF9fKHNlbGYsCiAgICAgICAgICAgICAgICAgbmlkOiBpbnQgPSAxMSwKICAgICAgICAgICAgICAgICBub21icmU6IHN0ciA9ICJtZXRhcG9kIiwKICAgICAgICAgICAgICAgICBhbHR1cmE6IGZsb2F0ID0gMC43LAogICAgICAgICAgICAgICAgIHBlc286IGZsb2F0ID0gOS45LAogICAgICAgICAgICAgICAgIHRpcG86IHN0ciA9ICJiaWNobyIpOgogICAgICAgIHNlbGYuX25pZCA9IG5pZAogICAgICAgIHNlbGYuX25vbWJyZSA9IG5vbWJyZQogICAgICAgIHNlbGYuX2FsdHVyYSA9IGFsdHVyYQogICAgICAgIHNlbGYuX3Blc28gPSBwZXNvCiAgICAgICAgc2VsZi5fdGlwbyA9IHRpcG8KCiAgICAgICAgCiAgICBkZWYgdG9fbGlzdChzZWxmKToKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICBzZWxmLl9uaWQsCiAgICAgICAgICAgIHNlbGYuX25vbWJyZSwKICAgICAgICAgICAgc2VsZi5fYWx0dXJhLAogICAgICAgICAgICBzZWxmLl9wZXNvLAogICAgICAgICAgICBzZWxmLl90aXBvXQogICAgICAgIAogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGYie3NlbGYuX25pZH0ve3NlbGYuX25vbWJyZX06IHtzZWxmLl9hbHR1cmF9IG0uIHtzZWxmLl9wZXNvfSBrZy4iIFwKICAgICAgICAgICAgICAgICsgZiIgLS0ge3NlbGYuX3RpcG99IgoKCmRlZiBjcmVhX3Bva2Vtb25zKCk6CiAgICByZXR1cm4gWwogICAgICAgIFBva2Vtb24oMSwgICAiYnVsYm9zYXVyIiwgMC43LCA2LjksICAicGxhbnRhIiksIAogICAgICAgIFBva2Vtb24oMjUsICAicGlrYWNodSIsICAgMC40LCA2LjAsICAiZWzDqWN0cmljbyIpLAogICAgICAgIFBva2Vtb24oMjYsICAicmFpY2h1IiwgICAgMC44LCAzMC4wLCAiZWzDqWN0cmljbyIpLAogICAgICAgIFBva2Vtb24oMjU3LCAiYmxhemlrZW4iLCAgMS45LCA1Mi4wLCAiZnVlZ28iKSwKICAgIF0KCgpkZWYgZ3VhcmRhX3Bva2Vtb25zX3R4dChwb2tlbW9uczogbGlzdFtQb2tlbW9uXSk6CiAgICB3aXRoIG9wZW4oInBva2Vtb25zLnR4dCIsICJ3dCIsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGY6CiAgICAgICAgZm9yIHAgaW4gcG9rZW1vbnM6CiAgICAgICAgICAgIHByaW50KHN0cihwKSwgZmlsZT1mKQogICAgICAgICAgICAjZi53cml0ZShzdHIocCkgKyAiXG4iKQoKCmRlZiByZWN1cGVyYV9hcmNoaXZvX3Bva2Vtb25zX3R4dChuZjogc3RyKToKICAgIHdpdGggb3BlbihuZiwgInJ0IikgYXMgZjoKICAgICAgICBmb3IgbGluZWEgaW4gZjoKICAgICAgICAgICAgcHJpbnQobGluZWEuc3RyaXAoKSkKICAgICAgICAgICAgCgpkZWYgZ3VhcmRhX3Bva2Vtb25zX2Nzdihwb2tlbW9uczogbGlzdFtQb2tlbW9uXSk6CiAgICB3aXRoIG9wZW4oInBva2Vtb25zLmNzdiIsICJ3dCIsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGY6CiAgICAgICAgcHJpbnQoIm5pZCxub21icmUsYWx0dXJhLHBlc28sdGlwbyIsIGZpbGU9ZikKICAgICAgICB3ID0gY3N2LndyaXRlcihmKQogICAgICAgIGZvciBwIGluIHBva2Vtb25zOgogICAgICAgICAgICB3LndyaXRlcm93KHAudG9fbGlzdCgpKQogICAgICAgICAgICAKICAgICAgICAgICAgCmRlZiBndWFyZGFfcG9rZW1vbnNfanNvbihwb2tlbW9uczogbGlzdFtQb2tlbW9uXSk6CiAgICBwb2tlbW9uX2RpY3RzID0gW3AuX19kaWN0X18gZm9yIHAgaW4gcG9rZW1vbnNdCiAgICB3aXRoIG9wZW4oInBva2Vtb25zLmpzb24iLCAid3QiLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmOgogICAgICAgIGpzb24uZHVtcChwb2tlbW9uX2RpY3RzLCBmKQogICAgICAgIAogICAgICAgIApkZWYgcmVjdXBlcmFfYXJjaGl2b19wb2tlbW9uc19qc29uKG5mOiBzdHIpIC0+IGxpc3RbUG9rZW1vbl06CiAgICB0b3JldDogbGlzdFtQb2tlbW9uXSA9IFtdCiAgICAgICAgICAgIAogICAgd2l0aCBvcGVuKG5mLCAicnQiKSBhcyBmOgogICAgICAgIHBva2Vtb25fZGljdHMgPSBqc29uLmxvYWQoZikKICAgICAgICAKICAgIGZvciBwZCBpbiBwb2tlbW9uX2RpY3RzOgogICAgICAgIHAgPSBQb2tlbW9uKCkKICAgICAgICBwLl9fZGljdF9fID0gcGQKICAgICAgICB0b3JldC5hcHBlbmQocCkKCiAgICByZXR1cm4gdG9yZXQKCgpkZWYgcmVjdXBlcmFfYXJjaGl2b19wb2tlbW9uc19jc3YobmY6IHN0cikgLT4gbGlzdFtQb2tlbW9uXToKICAgIHRvcmV0OiBsaXN0W1Bva2Vtb25dID0gW10KICAgIAogICAgd2l0aCBvcGVuKG5mLCAicnQiKSBhcyBmOgogICAgICAgIHIgPSBjc3YuRGljdFJlYWRlcihmKQogICAgICAgIGZvciBsaW5lYSBpbiByOgogICAgICAgICAgICB0b3JldC5hcHBlbmQoCiAgICAgICAgICAgICAgICBQb2tlbW9uKAogICAgICAgICAgICAgICAgICAgIGludChsaW5lYVsibmlkIl0pLAogICAgICAgICAgICAgICAgICAgIGxpbmVhWyJub21icmUiXSwKICAgICAgICAgICAgICAgICAgICBmbG9hdChsaW5lYVsiYWx0dXJhIl0pLAogICAgICAgICAgICAgICAgICAgIGZsb2F0KGxpbmVhWyJwZXNvIl0pLAogICAgICAgICAgICAgICAgICAgIGxpbmVhWyJ0aXBvIl0pKQoKICAgIHJldHVybiB0b3JldAoKCmRlZiBjcmVhX2FyY2hpdm9fcG9rZW1vbnNfdHh0KCk6CiAgICBwb2tlbW9ucyA9IGNyZWFfcG9rZW1vbnMoKQogICAgZ3VhcmRhX3Bva2Vtb25zX3R4dChwb2tlbW9ucykKICAgIAogICAgCmRlZiBsZWVfYXJjaGl2b19wb2tlbW9uc190eHQoKToKICAgIHJlY3VwZXJhX2FyY2hpdm9fcG9rZW1vbnNfdHh0KCJwb2tlbW9ucy50eHQiKQoKCmRlZiBjcmVhX2FyY2hpdm9fcG9rZW1vbnNfY3N2KCk6CiAgICBwb2tlbW9ucyA9IGNyZWFfcG9rZW1vbnMoKQogICAgZ3VhcmRhX3Bva2Vtb25zX2Nzdihwb2tlbW9ucykKICAgIAogICAgCmRlZiBsZWVfYXJjaGl2b19wb2tlbW9uc19jc3YoKToKICAgIHBva2Vtb25zID0gcmVjdXBlcmFfYXJjaGl2b19wb2tlbW9uc19jc3YoInBva2Vtb25zLmNzdiIpCiAgICBmb3IgcCBpbiBwb2tlbW9uczoKICAgICAgICBwcmludChwKQogICAgCiAgICAKZGVmIGxlZV9hcmNoaXZvX3Bva2Vtb25zX2pzb24oKToKICAgIHBva2Vtb25zID0gcmVjdXBlcmFfYXJjaGl2b19wb2tlbW9uc19qc29uKCJwb2tlbW9ucy5qc29uIikKICAgIGZvciBwIGluIHBva2Vtb25zOgogICAgICAgIHByaW50KHApCiAgICAgICAgCiAgICAKZGVmIGNyZWFfYXJjaGl2b19wb2tlbW9uc19qc29uKCk6CiAgICBwb2tlbW9ucyA9IGNyZWFfcG9rZW1vbnMoKQogICAgZ3VhcmRhX3Bva2Vtb25zX2pzb24ocG9rZW1vbnMpCiAgICAKICAgIApkZWYgbGVlX2FyY2hpdm9fcG9rZW1vbnNfY3N2X3BhbmRhcygpOgogICAgZGZwOiBwZC5EYXRhRnJhbWUgPSBwZC5yZWFkX2NzdigicG9rZW1vbnMuY3N2IikKICAgIHByaW50KCJUb2RvcyBsb3MgcG9rZW1vbnNcbiIsIGRmcCkKICAgIAogICAgZGZfbm9tYnJlX3Blc28gPSBkZnBbWyJub21icmUiLCAicGVzbyJdXQogICAgcHJpbnQoIlRvZG9zIGxvcyBwb2tlbW9ucyAobm9tYnJlIHkgcGVzbylcbiIsIGRmX25vbWJyZV9wZXNvKQogICAgCiAgICBwcmludCgiVG9kb3MgbG9zIHBva2Vtb25zIChub21icmUpXG4iLCBkZnBbWyJub21icmUiXV0pCiAgICBkZnAuYWx0dXJhLmhpc3QoKQogICAgcGx0LnhsYWJlbCgiQWx0dXJhcyIpCiAgICBwbHQueWxhYmVsKCJDdcOhbnRvcyIpCiAgICBwbHQuc2hvdygpCgogICAgCmRlZiBtYWluKCk6CiAgICAjIGNyZWFfYXJjaGl2b19wb2tlbW9uc190eHQoKQogICAgIyBsZWVfYXJjaGl2b19wb2tlbW9uc190eHQoKQogICAgIyBjcmVhX2FyY2hpdm9fcG9rZW1vbnNfY3N2KCkKICAgICMgbGVlX2FyY2hpdm9fcG9rZW1vbnNfY3N2KCkKICAgICMgY3JlYV9hcmNoaXZvX3Bva2Vtb25zX2pzb24oKQogICAgIyBsZWVfYXJjaGl2b19wb2tlbW9uc19qc29uKCkKICAgIGxlZV9hcmNoaXZvX3Bva2Vtb25zX2Nzdl9wYW5kYXMoKQoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBtYWluKCkK