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 (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.
Aca esta el codigo que menciono:
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é:
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.
Gracias por tu respuesta, pero siguie sin funcionar:
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
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:
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.
Hay muchas cosas que no tienen sentido
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í
login_name = input("login: ")
Donde tienes la función password no solo guardas el password si no también el user
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
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()