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

  • 6 Respuestas
  • 7939 Vistas

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado n1sendev

  • *
  • Underc0der
  • Mensajes: 75
  • Actividad:
    0%
  • Reputación 0
  • No sabes lo que tienes hasta que lo pierdes.
    • Ver Perfil
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.
« Última modificación: Noviembre 13, 2017, 12:56:15 am por Gabriela »

Desconectado Once

  • *
  • Ex-Staff
  • *****
  • Mensajes: 391
  • Actividad:
    0%
  • Reputación 0
  • Twitter: @don_once
    • Ver Perfil
    • El blog de Once
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.


Desconectado n1sendev

  • *
  • Underc0der
  • Mensajes: 75
  • Actividad:
    0%
  • Reputación 0
  • No sabes lo que tienes hasta que lo pierdes.
    • Ver Perfil
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

Desconectado Once

  • *
  • Ex-Staff
  • *****
  • Mensajes: 391
  • Actividad:
    0%
  • Reputación 0
  • Twitter: @don_once
    • Ver Perfil
    • El blog de Once
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.

Desconectado n1sendev

  • *
  • Underc0der
  • Mensajes: 75
  • Actividad:
    0%
  • Reputación 0
  • No sabes lo que tienes hasta que lo pierdes.
    • Ver Perfil
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

Desconectado Once

  • *
  • Ex-Staff
  • *****
  • Mensajes: 391
  • Actividad:
    0%
  • Reputación 0
  • Twitter: @don_once
    • Ver Perfil
    • El blog de 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) [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.
« Última modificación: Noviembre 13, 2017, 03:53:07 pm por Once »

Desconectado $francisco

  • *
  • Underc0der
  • Mensajes: 194
  • Actividad:
    0%
  • Reputación 0
  • Skype: hackloper
    • Ver Perfil
    • Email
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()
« Última modificación: Noviembre 14, 2017, 08:44:26 pm por $francisco »