Underc0de

Foros Generales => Dudas y pedidos generales => Mensaje iniciado por: n1sendev en Noviembre 12, 2017, 11:53:15 PM

Título: Como escribir y leer una lista en fichero de texto Python 3?
Publicado por: n1sendev en Noviembre 12, 2017, 11:53:15 PM
Como puedo hacer eso? Me refiero, tengo esta lista que esta escrita en un fichero de texo: ["n1sendev", 1234] y la quiero comparar con una introducida por teclado (la cual se va guardando en otra lista en una variable)
La duda esta es que no me escribe la lista como ["n1sendev", 1234] sino como n1sendev (salto de linea) 1234 y la duda tambien esta en como se pueden comparar.
Saludos.
PD: por las dudas, no, no es un tarea ni nada, es para un proyecto propio.
Título: Re:Como escribir y leer una lista en fichero de texto Python 3?
Publicado por: Once en Noviembre 13, 2017, 12:04:22 AM
Hola n1sendev sería de gran ayuda si puedieras colocar el código que estás usando, en especial para ver cómo estás guardando y qué formato estás usando.

Ahora, hay un par de cosas que no quedan claras, por ejemplo, quieres validar también tipos, es decir, "1234" es distinto a 1234?. Si es así, usar un simple archivo de texto no te va a servir, porque en él se guardan siempre cadenas, entonces no podras saber si lo que está en el archivo originalmente fue un número o un string. (Tendrías que implementar una especie de  protocolo para diferencias entre tipos)

Ahora, una solución, que te puedo dar y que te haría la vida mucho más fácil es que uses serialización (http://pyspanishdoc.sourceforge.net/lib/module-pickle.html) que te permite guardar un objeto en un archivo de texto y luego recuperar. En Python tienes dos opciones, Pickle y cPickle https://docs.python.org/3.1/library/pickle.html

Usando serialización, solo tienes que escribir la lista en el archivo de texto, luego la lees y lo que te retorna no es un string, sino la lista como tal y ahí, las puedes comparar.

Para la comparación, necesitamos más información, porque si no te importa el tipo de los datos, y asumiendo que guardas cada lista en una línea separada, puedes leer toda la línea, hacer un split (para separar por espacios) y luego comparar estos datos separados con la lista. Pero acá hay otro problema y es cómo quieres hacer la comparación: ¿el orden importa?

Saludos.

Título: Re:Como escribir y leer una lista en fichero de texto Python 3?
Publicado por: n1sendev en Noviembre 13, 2017, 12:22:46 AM
Aca esta el codigo que menciono:
Código (python) [Seleccionar]
def logon():
    cmd_input = input("login: ")
   
    global login_name
    login_name = cmd_input

    cmd_input = input("password: ")

    global login_pass
    login_pass = cmd_input

    file = open('boot_data.txt', 'r')
    for ln in file.readlines():
        name = ln

    file.close()

    if login_name == name and login_pass == password:
        print("Welcome %s!" % login_name)
        maincmd()
    else:
        print("login incorrect!")

def password():
    list_cr = ["n1sendev", 1234]
    file = open('boot_data.txt', 'w')
   
    for item in list_cr:
        file.write('\r%s' % item)
    file.close()

password()


Mi proyecto esta dividido es muchos mas scripts, pero es solo este el codigo que me genera problemas
Título: Re:Como escribir y leer una lista en fichero de texto Python 3?
Publicado por: Once en Noviembre 13, 2017, 01:17:17 AM
Ok, mira las líneas que te seleccioné:

Código (python, 18, 14) [Seleccionar]
def logon():
    cmd_input = input("login: ")
   
    global login_name
    login_name = cmd_input

    cmd_input = input("password: ")

    global login_pass
    login_pass = cmd_input

    file = open('boot_data.txt', 'r')
    for ln in file.readlines():
        name = ln

    file.close()

    if login_name == name and login_pass == password:
        print("Welcome %s!" % login_name)
        maincmd()
    else:
        print("login incorrect!")

def password():
    list_cr = ["n1sendev", 1234]
    file = open('boot_data.txt', 'w')
   
    for item in list_cr:
        file.write('\r%s' % item)
    file.close()

password()


En la 14, el problema es que estpás sobreescribiendo name, por lo que lee la primer línea y la guarda en name, pero luego lee la segunda y la guarda en name sobreescribiendo el valor anterior.

En la 18, el problema es que estás intentando comparar una variable (login_pass) con una función (password).

Saludos.
Título: Re:Como escribir y leer una lista en fichero de texto Python 3?
Publicado por: n1sendev en Noviembre 13, 2017, 02:34:17 PM
Gracias por tu respuesta, pero siguie sin funcionar:
Código (python) [Seleccionar]
def logon():
    while True:
        cmd_input = input("login: ")
   
        global login_name
        login_name = cmd_input

        cmd_input = int(input("password: "))

        global login_pass
        login_pass = cmd_input

        list_cr_input = [login_name, login_pass]

        file = open('boot_data.txt', 'r')
        for ln in file.readlines():
            list_cr_file = ln
            print(list_cr_input)
            print(list_cr_file)

        file.close()

        if list_cr_file == list_cr_input:
            break
            print("Welcome %s!" % login_name)
            maincmd()
        else:
            print("login incorrect!")

def password():
    list_cr_file = ["n1sendev", 1234]
    file = open('boot_data.txt', 'w')
    file.write('\r%s' % list_cr_file)
    file.close()

password()

Ahora si guarda en el archivo la lista como quieria, y la lee como quieria tambien, pero cuando hago la comparacion de la lista list_cr_file, la cual es la lista que se obtuvo del archivo, y la lista list_cr_input es donde se guarda la informacion introducida por teclado, ambas listas son iguales, pero al compararlas no funciona, me tira al else...
Saludos
Título: Re:Como escribir y leer una lista en fichero de texto Python 3?
Publicado por: Once en Noviembre 13, 2017, 03:51:20 PM
Hola,

Como te expliqué en mi primer respuesta, cuando guardas algo en un archivo de texto, ésta información se guarda como una cadena de caracteres (los archivos no conocen Python y por lo tanto no pueden almacenar objetos de Python ni de cualquier otro lenguaje). Por lo que el problema es que estás compararndo un string con una lista y es muy fácil comprobarlo, mira:

Código (python, 24, 25) [Seleccionar]
def logon():
    while True:
        cmd_input = input("login: ")
   
        global login_name
        login_name = cmd_input

        cmd_input = int(input("password: "))

        global login_pass
        login_pass = cmd_input

        list_cr_input = [login_name, login_pass]

        file = open('boot_data.txt', 'r')
        for ln in file.readlines():
            list_cr_file = ln
            print(list_cr_input)
            print(list_cr_file)

        file.close()
        print("->")
        print(list_cr_file)
        print(type(list_cr_file))
        print(type(list_cr_input))
        if list_cr_file == list_cr_input:
            break
            print("Welcome %s!" % login_name)
            maincmd()
        else:
            print("login incorrect!")

def password():
    list_cr_file = ["n1sendev", 1234]
    file = open('boot_data.txt', 'w')
    file.write('\r%s' % list_cr_file)
    file.close()

password()
logon()


Vas a obtener algo así:

Citar<class 'str'>
<class 'list'>

Así que de nuevo te remito a mi primer comentario, si insistes en querer comparar dos listas la mejor opción es usar serialización. Si no quieres usar serialización, vas a tener que diseñar un "protocolo", que te permita parsear ese string que se PARECE a una lista y convertirlo a una lista de verdad en Python.

Saludos.
Título: Re:Como escribir y leer una lista en fichero de texto Python 3?
Publicado por: $francisco en Noviembre 14, 2017, 08:35:44 PM
Hay muchas cosas que no tienen sentido
Código (python) [Seleccionar]

if list_cr_file == list_cr_input:
            break
            print("Welcome %s!" % login_name)
            maincmd()

Después del break no se va a imprimir nada
¿Porque tanto cambio de variable? Mejor quedaría así
Código (python) [Seleccionar]

login_name = input("login: ")


Donde tienes la función password no solo guardas el password si no también el user
Código (python) [Seleccionar]

def saveUser():
    list_cr_file = "n1sendev,1234\n"
    file = open('boot_data.txt', 'w')
    file.write('\r%s' % list_cr_file)
    file.close()

Guarda los datos en texto plano y para comprobar si esta el usuario en el archivo de texto no hace falta que lo guardes simplemente comprueba que coincida
Código (python) [Seleccionar]

file = open('boot_data.txt', 'r')
for ln in file.readlines():
    split = ln.split(',')
    user,passwd = split[0], split[1]
    print(user)
    print(passwd)
    if login_name == user:
        if login_pass == passwd:
            print("Welcome %s!" % login_name)
            maincmd()
        else:
            print('password invalid') 
    else:
        print('user invalid')
file.close()