0

I have a code where I have an email and a password in a text file in a list, formatted like this: ["tom@gmail.com","Password1"],["harry@gmail.com","Password2].

My code reads from the text file and compares it with a user input to see if it is present in the text file. For some reason when I input the first email "tom@gmail.com" it reads that from the text file but not "Password1", however it reads "harry@gmail.com" correctly as well as "Password2" correctly. I cant find any way to get around this and fix this? No error is received so I'm not sure where its going wrong. Here is my code:

def Login():
    with open("logindata.txt","r") as file:
        for line in file:
            line=line.split(",")
            logindata.append([line[0],line[1].rstrip()])
        print(logindata)
    found=False
    while found == False:
        email=input("Enter email:")
        password=input("Enter password:")
        with open("logindata.txt","r")as file:
            for line in file:
                line = line.split(",")
                if email in line:
                    print("Correct email")
                if password in line:
                    print("Correct Password")
                    found=True
if __name__ == "__main__":
Login()

if the code is run and you try the inputs I gave at the start then only the second email and password combination works. Here is what the text file looks like text file format

Appending:

username=input("Enter a new email")
        password=input("Enter a password")
        with open('logindata.txt','a')as file:
            line='\n'+ username + ',' + password
            file.write(line)
        print("user added")
venkatvb
  • 681
  • 1
  • 9
  • 24
Tom
  • 21
  • 4
  • You forgot to remove the newline; `password` is not in the line, `password\n` is. – Martijn Pieters Jan 03 '17 at 17:19
  • @MartijnPieters Sorry to come back to this but if I want to append a new email to the text file , I need the \n to be at the end of the password to get it onto the next line so how would I achieve this? – Tom Jan 03 '17 at 19:01
  • Best way: use `csv.writer()` to write the file. Each time you use the `writerow()` method on that it'll add the newline for you. Otherwise, add it manually when writing; `fileobj.write('{},{}\n'.format(userid, password))`, for example. – Martijn Pieters Jan 03 '17 at 19:02
  • @MartijnPieters I kind of want to stay away from csv and write, im not that familiar with them. I tried this which should work surely as its just adding a line before the username but it ends up putting the data two lines below instead of directly – Tom Jan 03 '17 at 19:30

1 Answers1

2

You are reading text with line separators. Your lines don't look like this:

tom@gmail.com,Password1

They actually look like this:

tom@gmail.com,Password1\n

When splitting that on the comma, you get this:

line = ['tom@gmail.com', 'Password1\n']

and the test 'Password1' in line fails, but 'Password1\n' in line would succeed.

The \n is a newline character. You'd need to remove that first; you could use str.strip() to handily remove all whitespace from the start and end:

for line in file:
    line = line.strip().split(",")
    if email in line:
        print("Correct email")
    if password in line:
        print("Correct Password")

Rather than manually split, you can use the csv module to read your file:

import csv

with open("logindata.txt", "r") as file:
    reader = csv.reader(file)
    for user, pw in reader:
        if email == user:
            print("Correct email")
        if password == pw:
            print("Correct Password")
Martijn Pieters
  • 1,048,767
  • 296
  • 4,058
  • 3,343