【问题标题】:Python: How do you read a specific line from a text file based on the previous line?Python:如何根据前一行从文本文件中读取特定行?
【发布时间】:2018-07-23 16:38:23
【问题描述】:

如果这是重复的,我深表歉意,但我找不到与我的具体问题相匹配的任何内容。我正在创建一个类似于银行系统的项目,并从文本文件中读取用户名、密码和金额。我有一个文本文件,第一行是用户名,第二行是密码,第三行是金额,然后是另一个具有相同模式的块。我正在检查用户输入的用户名是否在文件中,然后检查下一行并检查输入的密码是否是下一行。

f = open_file("D:/PythonProjects/banking.txt", "r") #open file   
read_file = f.read() #store contents of file in variable
name = input("Username: ")
pword = input("Password: ")
if name in read_file: #check if username is in file contents variable
    if pword in read_file:
       print("match")

到目前为止,如果您在文件中输入名称/密码,这将打印“匹配”,但我只是在寻找匹配的密码。我还有一个函数,它返回下一行并尝试调用两次以获取名称行之后的行。

def next_line(the_file):
'''Returns the next line from the_file'''
line = the_file.readline()
line = line.rstrip()
return line

【问题讨论】:

    标签: python-3.x text-files


    【解决方案1】:

    除了其他答案中提到的安全(加密)和效率(数据库)问题之外,这是一种将文件直接解析为字典的可能解决方案:

    data = {}
    filename = "D:/PythonProjects/banking.txt"
    with open(filename, "r") as fh:
        username = ""
        password = ""
        amount = -1
    
        line_mode = 1
        for line in fh:
            if line_mode % 3 == 1:
                username = line.strip()
                data[username] = {}
            elif line_mode % 3 == 2:
                password = line.strip()
                data[username][password] = -1
            elif line_mode % 3 == 0:
                amount = float(line.strip())
                data[username][password] = amount
    
            line_mode += 1 
    
    input_name = input("Username: ")
    input_password = input("Password: ")
    
    if input_name in data and input_password in data[input_name]:
        print("amount", data[input_name][input_password])
    else:
        print("User not found or password incorrect")
    

    编辑:我想到了一个更短的解决方案:

    filename = "D:/PythonProjects/banking.tx"
    data = {}
    
    with open(filename, "r") as fh:
        lines = [line.strip() for line in fh.readlines()]
        for i in range(0, len(lines), 3):
            data.setdefault(lines[i], {})[lines[i+1]] = lines[i+2]
    

    lines[i]lines[i+1]lines[i+3]是用户名、密码和金额。

    dict.setdefault(key, default) 要么返回键 lines[i] 的数据值,即用户名的条目,如果它已经存在,或者创建一个以用户名作为键的新字典,然后返回它。 现在确保 data[lines[i]] 存在并且可以填写密码(lines[i+1])和金额(lines[i+2])。

    【讨论】:

    • 您能向我解释一下较短解决方案中的最后一行吗?
    • 我用解释编辑了答案并使代码更容易。
    【解决方案2】:

    最好使用数据库。 SQLite 是一个很好的起点。你甚至不需要安装任何东西(因为 SQLite 已经包含在 Python 中)。玩得开心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多