将文本文件加载到python列表中

时间:2013-09-02 12:49:15

标签: python list text

我对Python非常陌生,所以毫无疑问有几个非常基本的错误,虽然我已经浏览了几个Python教程,但一切似乎都没问题。

我正在尝试将两个文本文件导入到我的列表中。

username.txt看起来像这样

  

USER1
  用户2
  user3

并且password.txt看起来像这样

  

PASS1
  PASS2
  pass3

当我运行所有内容时,调试器没有给我任何错误,但是当我尝试user/password组合时,它说它不正确。

你能看到任何错误,或者知道任何有用的东西吗?

这就是我正在运行的:

from Tkinter import *

username = ["nathan"]
password = ["1"]

def login():
        index = 0
        usrnm = usernameEntry.get()
        while index < len(username):
                if username[index] == usrnm:
                        psswrd = passwordEntry.get()
                        if password[index] == psswrd:
                                print("Success")
                                break
                        else:
                                print("Password doesn't exist!")
                                break
                else:
                        index = index + 1
        else:
                print("Username doesn't exist!")

def save():
        fWUsername = open("username.txt", "w")
        fWUsername.write("\n".join(str(x) for x in username))
        fWUsername.close

        fWPassword = open("password.txt", "w")
        fWPassword.write("\n".join(str(x) for x in password))
        fWPassword.close

def load():
        fRUsername = open("username.txt", "r")
        username = fRUsername.readlines()
        fRUsername.close()

        fRPassword = open("password.txt", "r")
        password = fRPassword.readlines()
        fRPassword.close()

loginForm = Tk()

usernameLabel = Label(loginForm, text = "username:")
usernameLabel.pack()

usernameEntry = Entry(loginForm)
usernameEntry.pack()

passwordLabel = Label(loginForm, text = "password:")
passwordLabel.pack()

passwordEntry = Entry(loginForm, show = "*")
passwordEntry.pack()

submitButton = Button(loginForm, text = "submit", command = login)
submitButton.pack()

loadButton = Button(loginForm, text = "load data lists", command = load)
loadButton.pack()

saveButton = Button(loginForm, text = "save data lists", command = save)
saveButton.pack()

mainloop()

2 个答案:

答案 0 :(得分:1)

这实际上是你在这里遇到的一个问题,因为它根本不是很明显。作为提示,您可以在代码中轻松打印一些其他信息,以便了解出现了什么问题。

在这种情况下,我在登录功能的开头放了一个print(username),看到只有nathan是有效用户,虽然我之前点击了加载按钮。

那发生了什么事?

变量usernamepassword都是在模块的根目录(脚本)中定义的;这使他们成为全局变量。可以从模块内的任何位置访问全局变量 - 除非它们被同名的局部变量隐藏。现在,虽然可以从任何地方访问它们,但默认情况下无法更改它们。

所以在你的load函数中,你有这个:

username = fRUsername.readlines()

这将在您的函数中声明一个 local 变量,隐藏全局变量。当函数结束时,该局部变量被丢弃;但是你的全局变量没有变化。

要更改此行为,您可以定义要使用全局变量usernamepassword。为此,请在函数开头为它们添加一个全局语句:

def load():
    global username, password
    username = ... # this now changes the _global_ variable

如果这样做,全局变量会被正确更改,所有用户名都可以从登录功能中获得。

但是,readlines将在每行后包含换行符。因此,用户名实际上是user1\nuser2\nuser3(与密码相同)。要解决这个问题,您可能需要在比较它们之前strip()这些值(删除所有前导和尾随空格)。

最后,建议在打开文件时使用with语句。这将确保句柄正确关闭(你不需要明确地调用close() - 你没有在保存方法中执行btw!):

with open('username.txt', 'r') as fRUsername:
    username = fRUsername.readlines()

答案 1 :(得分:0)

乍一看,代码看起来是正确的。解决这类问题的一个好方法是添加日志记录,以确保代码在运行时符合您的预期。将日志记录视为允许您随后调试问题的协议。这是一项非常有用的技能。

在您的情况下,您应该在加载用户名和密码后添加日志记录(打印您加载的数量)。如果这两个数字不一致或两者都是1,那么你就已经知道出了什么问题。

稍后,在搜索用户和密码时,请打印索引和预期密码。

注意:出于安全原因,您不应在记录期间打印密码。日志文件通常只受到弱保护。