Como escribir y leer una lista en fichero de texto Python 3?

Iniciado por n1sendev, Noviembre 12, 2017, 11:53:15 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Noviembre 12, 2017, 11:53:15 PM Ultima modificación: Noviembre 13, 2017, 12:56:15 AM por Gabriela
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.

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 (No tienes permitido ver los links. Registrarse o Entrar a mi cuenta) que te permite guardar un objeto en un archivo de texto y luego recuperar. En Python tienes dos opciones, Pickle y cPickle No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

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.








No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Aca esta el codigo que menciono:
Código: python
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

Ok, mira las líneas que te seleccioné:

Código: python, 18, 14
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.







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Gracias por tu respuesta, pero siguie sin funcionar:
Código: python
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

Noviembre 13, 2017, 03:51:20 PM #5 Ultima modificación: Noviembre 13, 2017, 03:53:07 PM por Once
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
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.







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Noviembre 14, 2017, 08:35:44 PM #6 Ultima modificación: Noviembre 14, 2017, 08:44:26 PM por $francisco
Hay muchas cosas que no tienen sentido
Código: python

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

login_name = input("login: ")


Donde tienes la función password no solo guardas el password si no también el user
Código: python

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

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()