是否有任何简单的方法来检查Python文本文件中的重复项?

问题描述 投票:-1回答:3

我想为我的银行帐户系统提供最后一个功能。

我希望它检查用户名是否已保存到文本文件数据库中。如果用户名已经存在,则应该告诉用户他们不能使用该名称选项。如果没有,那么他们将能够使用它。

我的其余代码正常工作,只是fcat,我无法正确附加/更新文本文件,并查看文本文件数据库中是否已存在用户名。

import sys


users = {}
status = ""

# Functions ---------------------------------------------------------------------------------------------------------

# Select either account creation or login
def displayMenu():
    global status

    status = input("Are you a registered user? \n1 - Yes \n2 - No \nQ - Quit \n")  
    if status == '1':
        oldUser()
    elif status == '2':
        newUser()
    else:
        print("Unknown input error, exiting . . . .")
        sys.exit(0)
    return status

# Account creation 
def newUser():
    global createLogin
    createLogin = input("Create login name: ")

    if createLogin in users: # check if login name exists
        print ("\nLogin name already exists!\n")
    else:
        createPassw = input("Create password: ")
        users[createLogin] = createPassw # add login and password
        print("\nAccount created!\n")
                                                #---- Storing the username in a txt file
        file = open("accountfile.txt", "a")
        file.write(createLogin)             
        file.write("\n")
        file.close()
        oldUser()



# Account login 
def oldUser():
    global login

    login = input("Enter login name: ")
    passw = input("Enter password: ")


    # check if user exists and login matches password
    if login in users and users[login] == passw:
        file = open("accountfile.txt", "r")
        for text in file:                           ######## This is where I'm trying to compare username duplicates
            if text in file == createLogin:
                print("Username already exists!")

        print("\nLogin successful!\n")
        Bank_Account()     
    else:
        print("\nUser doesn't exist or wrong password!\n")
        print("Restarting. Please enter details correctly . . . . .") 
        sys.exit(0)




class Bank_Account:

    def __init__(self): 
        self.balance=0
        response = ''

    def deposit(self):
        try:
            amount=float(input("Enter amount to be Deposited: "))
        except ValueError:
            print("Enter digits only")
        else:
            self.balance += amount 
            print("\n Amount Deposited:",amount) 

    def withdraw(self):
        try:
            amount = float(input("Enter amount to be Withdrawn: "))
            if self.balance>=amount: 
                self.balance-=amount 
                print("\n You Withdrew:", amount)
        except ValueError:
            print("Enter digits only")
            s.withdraw() 
        else:
            print("\n ")


    def display(self): 
        print("\n Remaining Balance=",self.balance)






displayMenu()

s = Bank_Account() 

# Calling functions with that class object 
s.deposit() 
s.withdraw() 
s.display()
python text
3个回答
1
投票

因此看起来您正在将用户输入写入文件accountfile.txt中。因此,在一些用户登录后,它可能类似于:

$ cat accountfile.txt
mike
sarah
morgan
lee

您有问题的代码部分在这里:

file = open("accountfile.txt", "r")
for text in file:
    if text in file == createLogin:
        print("Username already exists!")

此特定部分可能没有按照您认为的去做:

if text in file == createLogin

...if text in file返回TrueFalse。...因此,上面的行本质上是在说

if False == createLogin

if True == createLogin

我相信您想做的是检查accountfile.txt中是否有名称。为了实现该目标,您可以对代码进行的最小更改是

file = open("accountfile.txt", "r")
for text in file:
    if text.strip() == createLogin:  # .strip() will clean up the \n
        print("Username already exists!")

1
投票

而不是写入文本文件,而是尝试对数据库进行酸洗。这将保存对象的表示形式,您可以轻松地将其加载回程序中。

import pickle

users = {}

users["Ash"] = "password"
pickle.dump(users, open("users.p", "wb"))

loaded_users = pickle.load(open("users.p", "rb"))
if "Ash" in loaded_users:
    print(f"Ash password is: {users["Ash"]}")

更高级的解决方案可能是签出关系数据库,例如[sqlite3] [1]


1
投票

此行:if text in file == createLogin:是您犯错的地方。该行实质上是在说:“(如果文本在文件中,则将检查结果与字符串createLogin进行比较”。即if (True/False) == createLogin,它总是错误的,因为True / False布尔原语永远不会等于任何字符串(如果它实际运行,我还没有测试过是否会抛出异常)。

您应该做的是这个

for text in file: # get one line of text
      if createLogin == text.strip(): # compare the line with the user input string 
         print("Username already exists!")
         break

.strip()删除数据库存储名称中的任何前导或结尾空格(在这种情况下,换行符\n用来表示文件中行的结尾。break提前结束循环,因为您的查找是完成,因为您找到了要查找的内容,因此无需继续将用户输入的内容与其他字符串进行比较,假设txt具有1000个名称,而第一个名称是匹配项,则用户会看到打印的错误,但程序在其余999次尝试中将继续运行,这使其显得呆滞并浪费了不必要的CPU周期。

数据库仍然区分大小写,但是根据您的要求,可能需要也可能不需要。对于不区分大小写的用户,您可以执行以下操作:

for text in file: # get one line of text
      if createLogin.lower() == text.strip().lower(): # compare the line with the user input string 
         print("Username already exists!")
         break

[.lower()将两个字符串都变成小写字符串,然后检查它们是否相同,从而消除了大小写敏感性。

© www.soinside.com 2019 - 2024. All rights reserved.