elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  [Python] ABM archivo de texto
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [Python] ABM archivo de texto  (Leído 5,630 veces)
horacio_b92

Desconectado Desconectado

Mensajes: 15


Ver Perfil
[Python] ABM archivo de texto
« en: 4 Julio 2016, 01:51 am »

Buenas gente, necesito ayuda con un ABM de un archivo de bancos donde el mismo viene cada registro por linea y cada campo separado por coma, con los campos id, descripcion y si existe para poder hacer la baja logica. No me esta sobreescribiendo en la baja el registro donde estaba, alguna ayuda o otra forma de hacerlo?

Código:
class Bank:

    def __init__(self, id, description='', exist=1, pos=0):
        self.id = id
        self.description = description
        self.exist = exist
        self.pos = pos

    def __repr__(self):
        return "{0:4.4},{1:30.30},{2:1.1}\n".format(str(self.id), self.description, str(self.exist))


class Banks:

    def __init__(self, filename):
        self.filename = filename
        self.load()

    def upload_in_memory(self, f):
        length = 0
        for line in f.readlines():
            record = line.split(',')
            bank = Bank(int(record[0].replace('\x00', '').strip()))
            bank.description = record[1].strip()
            bank.exist = int(record[2].strip())
            bank.pos = length
            length += len(line)
            self.banks.append(bank)

    def load(self):
        self.banks = []
        try:
            f = open(self.filename, 'r')
            self.upload_in_memory(f)
        except IOError:
            return

    def exists(self, id):
        for bank in self.banks:
            if bank.id == id and bank.exist == 1:
                return True
        return False

    def save(self, id, description, exist, pos=0):
        bank = Bank(id, description, exist)
        if pos == 0:
            length = len(str(bank))
            position = (id * length) - length
        else:
            position = pos
        with open('maebancos.txt', 'a') as f:
            f.seek(position, 0)
            f.write(str(bank))

    def add(self, id):
        if not self.exists(id):
            description = raw_input("Descripcion: ")
            self.save(id, description, 1)
            print "{0} dado de alta con exito!!!".format(description)
            Menu.pause()
        else:
            print "El Banco ya ha sido dado de alta!!"
            Menu.pause()

    def search(self, id):
        for bank in self.banks:
            if bank.id == id:
                return bank

    def delete(self, id):
        if self.exists(id):
            bank = self.search(id)
            print "Codigo de banco: {0}\nDescripcion: {1}".format(bank.id, bank.description)
            opc = raw_input("Baja (B) Cancelar (C)").upper()
            if opc == 'B':
                self.save(bank.id, bank.description, 0, bank.pos)
                print "{0} dado de baja con exito!!".format(bank.description)
                Menu.pause()
        else:
            print "El banco no existe!!"
            Menu.pause()

    def update(self, id):
        if self.exists(id):
            bank = self.search(id)
            print "Codigo de banco: {0}\nDescripcion: {1}".format(bank.id, bank.description)
            print "Anote el nuevo dato"
            description = raw_input("Descripcion: ")
            self.save(bank.id, description, 1, bank.pos)
            print "{0} modificado con exito!!!".format(bank.description)
            Menu.pause()
        else:
            print "El banco no existe!!"
            Menu.pause()



class Menu:

    @staticmethod
    def pause():
        raw_input("Oprima una tecla para continuar")

    @staticmethod
    def input_code():
        while True:
            try:
                bank_code = int(raw_input("Codigo Banco: "))
                return bank_code
            except ValueError:
                print "Presta atencion, solo digitos!!"

    @staticmethod
    def menu():
        while True:
            prompt = "1) Alta de Banco\n2)Baja de Banco\n3)Modificacion de Banco\n"
            prompt += "Elija una opcion: "
            opc = int(raw_input(prompt))
            banks = Banks('maebancos.txt')
            if opc == 1:
                banks.add(Menu.input_code())
            elif opc == 2:
                banks.delete(Menu.input_code())
            elif opc == 3:
                banks.update(Menu.input_code())
            else:
                return



Menu.menu()

desde ya gracias, aclaro no puede usar base de datos lo tengo que hacer en archivo plano


En línea

peter_lyon

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: [Python] ABM archivo de texto
« Respuesta #1 en: 4 Julio 2016, 02:51 am »

Hola, nos cuentas pocas cosas como para tener un conocimiento total del problema. Te indico cosas que veo:

Python es un lenguaje que permite programar de mil formas diferentes. El código que veo, me recuerda mucho a Java y la obsesión con hacer programación orientada a objetos pura, lo cual solo sirve para complicar el código y hacer los programas más grandes y aburridos.

Luego, veo que estás usando como estructura de datos para los bancos una lista: banks = [].
No se si conoces ya los diccionarios. Un diccionario permite almacenar datos mediante una clave, en vez de tenerlos todos en una lista "lineal".

El símbolo para declarar un diccionario vacío es: {}
Ejemplo:

self.banks = {}

De esta forma, como supongo que los "id" de los bancos serán únicos, puedes usar la propia "id" de un banco para obtenerlo, en vez de recorrer toda la lista hasta encontrarlo (método search).

Ejemplo:

def search(self, id):
  if id in self.banks:  return self.banks[id] # si existe lo devuelvo
  else: return None  # devuelvo None porque no existe


Te recomiendo que la función save, genere un archivo nuevo, borrando todo lo que hubiera con anterioridad. Es decir, volcando una copia de banks al archivo. Todo será mucho más simple.

No se si tienes restricciones a la hora de usar unas determinadas cosas, no se si te han dado ya un diseño de como tienes que hacerlo y te han quitado la libertad de hacerlo como tú quieras.

Dinos hasta dónde eres libre para hacerlo como tú quieres, y si tienes libertad entonces te haré un programa bien hecho, con la mitad de líneas o menos que funciona muy bien y es mucho más simple de entender y programar, que es la filosofía de python.
El diseño que tú has seguido es una Programación Orienta a Objetos clásica, muy noventera, pero estamos en 2015, eso ya no está de moda ;D




En línea

MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.036


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: [Python] ABM archivo de texto
« Respuesta #2 en: 4 Julio 2016, 03:01 am »

Un poco de humor:

El diseño que tú has seguido es una Programación Orienta a Objetos clásica, muy noventera, pero estamos en 2015, eso ya no está de moda ;D

2016. Estamos en el año 2016...  :xD :xD :xD

Saludos!
En línea

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."

horacio_b92

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Re: [Python] ABM archivo de texto
« Respuesta #3 en: 4 Julio 2016, 03:53 am »

Hola, nos cuentas pocas cosas como para tener un conocimiento total del problema. Te indico cosas que veo:

Python es un lenguaje que permite programar de mil formas diferentes. El código que veo, me recuerda mucho a Java y la obsesión con hacer programación orientada a objetos pura, lo cual solo sirve para complicar el código y hacer los programas más grandes y aburridos.

Luego, veo que estás usando como estructura de datos para los bancos una lista: banks = [].
No se si conoces ya los diccionarios. Un diccionario permite almacenar datos mediante una clave, en vez de tenerlos todos en una lista "lineal".

El símbolo para declarar un diccionario vacío es: {}
Ejemplo:

self.banks = {}

De esta forma, como supongo que los "id" de los bancos serán únicos, puedes usar la propia "id" de un banco para obtenerlo, en vez de recorrer toda la lista hasta encontrarlo (método search).

Ejemplo:

def search(self, id):
  if id in self.banks:  return self.banks[id] # si existe lo devuelvo
  else: return None  # devuelvo None porque no existe


Te recomiendo que la función save, genere un archivo nuevo, borrando todo lo que hubiera con anterioridad. Es decir, volcando una copia de banks al archivo. Todo será mucho más simple.

No se si tienes restricciones a la hora de usar unas determinadas cosas, no se si te han dado ya un diseño de como tienes que hacerlo y te han quitado la libertad de hacerlo como tú quieras.

Dinos hasta dónde eres libre para hacerlo como tú quieres, y si tienes libertad entonces te haré un programa bien hecho, con la mitad de líneas o menos que funciona muy bien y es mucho más simple de entender y programar, que es la filosofía de python.
El diseño que tú has seguido es una Programación Orienta a Objetos clásica, muy noventera, pero estamos en 2015, eso ya no está de moda ;D






Hola no tengo ningún tipo de restricción para hacerlo, estoy aprendiendo así que si ves una mejor solución bienvenida sea. si conozco los diccionarios pero no lo habia pensado y seria mejor que usar clase. desde ya gracias por comentar



con respecto al problema es hacer un alta, baja, modificación o CRUD como quieras llamarle de banco con los atributos id y descripción.



Hola, nos cuentas pocas cosas como para tener un conocimiento total del problema. Te indico cosas que veo:

Python es un lenguaje que permite programar de mil formas diferentes. El código que veo, me recuerda mucho a Java y la obsesión con hacer programación orientada a objetos pura, lo cual solo sirve para complicar el código y hacer los programas más grandes y aburridos.

Luego, veo que estás usando como estructura de datos para los bancos una lista: banks = [].
No se si conoces ya los diccionarios. Un diccionario permite almacenar datos mediante una clave, en vez de tenerlos todos en una lista "lineal".

El símbolo para declarar un diccionario vacío es: {}
Ejemplo:

self.banks = {}

De esta forma, como supongo que los "id" de los bancos serán únicos, puedes usar la propia "id" de un banco para obtenerlo, en vez de recorrer toda la lista hasta encontrarlo (método search).

Ejemplo:

def search(self, id):
  if id in self.banks:  return self.banks[id] # si existe lo devuelvo
  else: return None  # devuelvo None porque no existe


Te recomiendo que la función save, genere un archivo nuevo, borrando todo lo que hubiera con anterioridad. Es decir, volcando una copia de banks al archivo. Todo será mucho más simple.

No se si tienes restricciones a la hora de usar unas determinadas cosas, no se si te han dado ya un diseño de como tienes que hacerlo y te han quitado la libertad de hacerlo como tú quieras.

Dinos hasta dónde eres libre para hacerlo como tú quieres, y si tienes libertad entonces te haré un programa bien hecho, con la mitad de líneas o menos que funciona muy bien y es mucho más simple de entender y programar, que es la filosofía de python.
El diseño que tú has seguido es una Programación Orienta a Objetos clásica, muy noventera, pero estamos en 2015, eso ya no está de moda ;D




Algo así, le hice los cambios que me sugeriste:
Código
  1. class Banks:
  2.  
  3.    def __init__(self, filename):
  4.        self.filename = filename
  5.        self.banks = {}
  6.        self.load()
  7.  
  8.    def upload_in_memory(self, f):
  9.        for line in f.readlines():
  10.            record = line.split(',')
  11.            id = record[0].strip()
  12.            description = record[1].strip()
  13.            self.banks[id] = description
  14.  
  15.    def load(self):
  16.        try:
  17.            f = open(self.filename, 'r')
  18.            self.upload_in_memory(f)
  19.        except IOError:
  20.            return
  21.  
  22.    def search(self, id):
  23.        if id in self.banks:
  24.            return self.banks[id]
  25.        return None
  26.  
  27.    def to_s(self, id, description):
  28.        return "{0:4.4},{1:30.30}\n".format(id, description)
  29.  
  30.    def save(self):
  31.        f = open('maebancos.txt', 'w')
  32.        for key, value in self.banks.items():
  33.            record = self.to_s(key, value)
  34.            f.write(record)
  35.        f.close()
  36.  
  37.    def add(self, id):
  38.        bank = self.search(id)
  39.        if not bank:
  40.            description = raw_input("Descripcion: ")
  41.            self.banks[id] = description
  42.            self.save()
  43.            print "{0} dado de alta con exito!!!".format(description)
  44.            pause()
  45.        else:
  46.            print "El Banco ya ha sido dado de alta!!"
  47.            pause()
  48.  
  49.    def delete(self, id):
  50.        bank = self.search(id)
  51.        if bank:
  52.            print "Codigo de banco: {0}\nDescripcion: {1}".format(id, bank)
  53.            opc = raw_input("Baja (B) Cancelar (C)").upper()
  54.            if opc == 'B':
  55.                del self.banks[id]
  56.                self.save()
  57.                print "{0} dado de baja con exito!!".format(bank)
  58.                pause()
  59.        else:
  60.            print "El banco no existe!!"
  61.            pause()
  62.  
  63.    def update(self, id):
  64.        bank = self.search(id)
  65.        if bank:
  66.            print "Codigo de banco: {0}\nDescripcion: {1}".format(id, bank)
  67.            print "Anote el nuevo dato"
  68.            description = raw_input("Descripcion: ")
  69.            self.banks[id] = description
  70.            self.save()
  71.            print "{0} modificado con exito!!!".format(bank)
  72.            pause()
  73.        else:
  74.            print "El banco no existe!!"
  75.            pause()
  76.  
  77.  
  78. def pause():
  79.    raw_input("Oprima una tecla para continuar")
  80.  
  81.  
  82. def input_code():
  83.    while True:
  84.        try:
  85.            bank_code = raw_input("Codigo Banco: ")
  86.            return bank_code
  87.        except ValueError:
  88.            print "Presta atencion, solo digitos!!"
  89.  
  90. def menu():
  91.    while True:
  92.        prompt = "1) Alta de Banco\n2)Baja de Banco\n3)Modificacion de Banco\n4)Salir\n"
  93.        prompt += "Elija una opcion: "
  94.        opc = int(raw_input(prompt))
  95.        banks = Banks('maebancos.txt')
  96.        if opc == 1:
  97.            banks.add(input_code())
  98.        elif opc == 2:
  99.            banks.delete(input_code())
  100.        elif opc == 3:
  101.            banks.update(input_code())
  102.        elif opc == 4:
  103.            return
  104.  
  105. menu()
  106.  
  107.  



Hola, nos cuentas pocas cosas como para tener un conocimiento total del problema. Te indico cosas que veo:

Python es un lenguaje que permite programar de mil formas diferentes. El código que veo, me recuerda mucho a Java y la obsesión con hacer programación orientada a objetos pura, lo cual solo sirve para complicar el código y hacer los programas más grandes y aburridos.

Luego, veo que estás usando como estructura de datos para los bancos una lista: banks = [].
No se si conoces ya los diccionarios. Un diccionario permite almacenar datos mediante una clave, en vez de tenerlos todos en una lista "lineal".

El símbolo para declarar un diccionario vacío es: {}
Ejemplo:

self.banks = {}

De esta forma, como supongo que los "id" de los bancos serán únicos, puedes usar la propia "id" de un banco para obtenerlo, en vez de recorrer toda la lista hasta encontrarlo (método search).

Ejemplo:

def search(self, id):
  if id in self.banks:  return self.banks[id] # si existe lo devuelvo
  else: return None  # devuelvo None porque no existe


Te recomiendo que la función save, genere un archivo nuevo, borrando todo lo que hubiera con anterioridad. Es decir, volcando una copia de banks al archivo. Todo será mucho más simple.

No se si tienes restricciones a la hora de usar unas determinadas cosas, no se si te han dado ya un diseño de como tienes que hacerlo y te han quitado la libertad de hacerlo como tú quieras.

Dinos hasta dónde eres libre para hacerlo como tú quieres, y si tienes libertad entonces te haré un programa bien hecho, con la mitad de líneas o menos que funciona muy bien y es mucho más simple de entender y programar, que es la filosofía de python.
El diseño que tú has seguido es una Programación Orienta a Objetos clásica, muy noventera, pero estamos en 2015, eso ya no está de moda ;D



dejo el codigo en:
https://github.com/horaciobelardita/ejercicios_programacion_I/blob/master/Ejercicio30_31/file.py
otra cosa ahora tendría que agregarle la posibilidad de agregar cuentas asociada con un banco, es decir, un banco tiene muchas cuentas, en otro archivo con los campos id_cuenta, id_banco, descripción_cuenta. como me conviene hacerlo si bien ahora las cuentas tienen un id único, uso diccionario con clave la id de cuenta y valores una lista con id_banco y descripción o conviene con objeto? desde ya gracias por la ayuda

Mod: no hagas doble post
« Última modificación: 4 Julio 2016, 12:32 pm por MCKSys Argentina » En línea

peter_lyon

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: [Python] ABM archivo de texto
« Respuesta #4 en: 6 Julio 2016, 00:19 am »

Madre mía qué locura de código jajajaja

No entiendo como vuestros profesores os meten problemas tan grandes sin enseñaros primero cosas como un diccionario...

Parece que esto es igual en todos los sitios, enseñar poquito y mandar tareas muy complejas para que el alumno tarde muchas horas en hacer los trabajos...

Por lo que has subido a Github, veo que has avanzado mucho con el problema.
Un consejo, ya que no estás usando clases y usas contenedores genéricos de python como listas y diccionarios, puedes usar algún formato estándar como JSON o XML, para guardar los datos de una forma más simple, con esto hubieras ahorrado un buen rato de trabajo:


import json


def load_file(filename):
   with open(filename) as b:
       banks = json.load(b)

   
def save_to_file(filename):
   with open(filename, "wb") as b:
      json.dump(banks, b)



Por cierto, si algún día estás interesado en hacer este mismo "reto" pero de forma profesional, puedo enseñarte como hacerlo, verás que es mucho más fácil que como tú lo haces, pero hay que conocer las herramientas adecuadas.

MOD EDIT: No hacer doble post.
« Última modificación: 6 Julio 2016, 01:50 am por MCKSys Argentina » En línea

horacio_b92

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Re: [Python] ABM archivo de texto
« Respuesta #5 en: 6 Julio 2016, 00:24 am »

Por cierto, si algún día estás interesado en hacer este mismo "reto" pero de forma profesional, puedo enseñarte como hacerlo, verás que es mucho más fácil que como tú lo haces, pero hay que conocer las herramientas adecuadas.

hola si bienvenido cualquier sugerencia para mejorar, me dejas tu correo por MP o como nos comunicamos para ensenarme? gracias y saludos
En línea

tincopasan


Desconectado Desconectado

Mensajes: 1.287

No es lo mismo conocer el camino que recorrerlo.


Ver Perfil
Re: [Python] ABM archivo de texto
« Respuesta #6 en: 6 Julio 2016, 03:47 am »

estaría bueno que peter_lyon si sabes un código mejor, lo publiques así todos podemos aprender.
En línea

peter_lyon

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: [Python] ABM archivo de texto
« Respuesta #7 en: 6 Julio 2016, 23:36 pm »

No os preocupéis, ahora mismo ando terminando un proyecto (es un programa python por cierto...), pero en unos días comienzo mis vacaciones.

Os haré un pequeño tutorial para hacer una aplicación con esas funcionalidades pero de forma profesional, con bases de datos, interfaz web con diseño responsive, diseño elegante, etc.

Las apps con interfaz de consola, están bien para aprender, pero nadie va a abrir un terminal para ejecutar una aplicación de este tipo.

En línea

horacio_b92

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Re: [Python] ABM archivo de texto
« Respuesta #8 en: 7 Julio 2016, 14:13 pm »

dale peter_lyon seria muy bueno, lo hago en terminal porque no es profesional ni comercial solo meramente académico. Tambien cuando puedas y si tenes ganas de explicar como podría hacer simplemente la creación, eliminación, modificación de en este caso por ejemplo Banco con su id, descripción usando objetos, validar que no se ingresen duplicados, ya sea almacenando en JSON o en txt. Gracias
En línea

peter_lyon

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: [Python] ABM archivo de texto
« Respuesta #9 en: 7 Julio 2016, 14:21 pm »

Es muy simple, tú por un lado vas a tener en memoria, tu diccionario de bancos(  banks = {} )

Cuando arranques la app cargas este diccionario del JSON, si es que este existe y tiene contenido, sino, banks = {}.

Cada vez que se altera tu diccionario en memoria, vuelves a volcarlo a JSON con la función que te dejé (save_to_file), que borra lo que hubiera antes en el fichero y lo actualiza con los nuevos contenidos.

De esta forma, si cada vez que alteres tu lista en memoria, haces un volcado nuevo a JSON con la función save_to_file, te olvidas del trabajo de estar buscando registros por el fichero y demás complicaciones.
Te dejo las 3 funciones que me pides, están escritas sobre la marcha, no las he probado pero supongo que si hay algún fallo será alguna tontería de sintaxis y sabrás arreglarlo.

Para añadir banco:

def add_banck(id, descipt):
  if id in banks:  return False # Ya existe, devolvemos false
  else:
    banks[id] = descript
    save_to_file("banks.json")
    return True # operacion completada con exito

para eliminar un banco:

def del_bank(id):
  if "id" in banks:
    del banks[id]
    save_to_file("banks.json")
    return True
  else: return False # No existe, no se puede borrar


para editar un banco:

def change_bank_descript(id, new_descript):
  if id in banks:
    banks[id].descript = new_descript
    save_to_file("banks.json")
    return True
  else:
    return False # no existe


  
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
¿Como se escribe una variable en un archivo de texto?(python)
Scripting
desnight 1 7,817 Último mensaje 5 Abril 2008, 04:21 am
por MM_code
Buscar texto dentro de archivo de texto por GUI
GNU/Linux
spysecurityca 1 1,185 Último mensaje 30 Diciembre 2014, 03:01 am
por MinusFour
(Python) Indexado de archivo de texto
Scripting
horacio_b92 2 1,980 Último mensaje 6 Julio 2016, 00:30 am
por horacio_b92
[Python 3]Saber codificacion de un archivo de texto
Scripting
n1sen 4 2,740 Último mensaje 3 Diciembre 2017, 19:52 pm
por Eleкtro
[PYTHON]¿Crear archivo de texto?
Scripting
e 5 1,656 Último mensaje 5 Abril 2018, 17:50 pm
por e
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines