【问题标题】:Python - Can't Read Entire .txt File: .readlines error?Python - 无法读取整个 .txt 文件:.readlines 错误?
【发布时间】:2018-08-05 04:56:37
【问题描述】:

我试图让 python 完整地读取我的 .txt 文件,以便确定用户名/密码的有效性……但它似乎只读取第一行而忽略其余部分。只有 .txt 上的第一个用户名/密码才会授予访问权限。

def login():
username = textentry.get()
password = textentry2.get()
database=open('database.txt')
for line in database.readlines():
    usr, pas = line.strip().split("-")
    if (username in usr) and (password in pas):
        credentialcheck.insert(END, "welcome")
        return True
    credentialcheck.insert(END, "username or password incorrect")
    return False

这一切都通过了:

def accessgranted():
    credentialcheck.delete(0.0, END)
    userandpass=login()
    if userandpass == True: quit()

.txt 文件:

abc-123
test-test
user-pass

【问题讨论】:

  • 请从if 结构中删除return True。还可以使用生成器从文件中读取效率更高!

标签: python readlines


【解决方案1】:

因为您在“if”语句的每个分支中都返回。在 if 条件中返回 True 似乎没问题,但是从循环中删除另一个 return 语句。当循环结束而没有为文件中的任何条目返回 True 时,这意味着输入的凭据无效。然后你可以返回 False。

【讨论】:

    【解决方案2】:

    为了简化代码,我在不影响结果的情况下做了一些修改。

    def login():
      username = "test"
      password = "test"
      database=open('database.txt')
      for line in database.readlines():
         usr, pas = line.strip().split("-")
         if (username in usr) and (password in pas):
             print ("welcome")
             return True
         print ("error")
         return False
    login()
    

    为了检查读取行方法的全部结果,我打印了从文件中读取的列表。

    def login():
        username = "test"
        password = "test"
        database=open('database.txt')
        print (database.readlines())
        for line in database.readlines():
            print (line)
            usr, pas = line.strip().split("-")
            print (usr,pas)
            if (username in usr) and (password in pas):
                print ("welcome")
                return True
            print ("error")
            return False
    login()
    

    输出:

    ['abc-123                                                                 \n', 'test-test                                                               \n', 'user-pass']
    

    所以这个bug不是因为database.readlines()没用,而是print (database.readlines())之后的代码。 p>

    database.readlines() 变成了 []

    这是因为在我们第一次分配readlines方法后,文件光标指向了文件末尾。因此,除非将文件光标更改为文件开头,否则我们无法读取更多字符。

    而您的问题是每次 if-case 语句完成后返回!修改你的return false句的缩进后,如果用户名和密码都不能匹配,就会赋值,问题就解决了!

    现在我们只是修改代码:

    def login():
        username = "test"
        password = "test"
        database=open('database.txt')
        print (database.readlines())
        print (database.readlines())
        for line in database.readlines():
            print (line)
            usr, pas = line.strip().split("-")
            print (usr,pas)
            if (username in usr) and (password in pas):
                print ("welcome")
                return True
        print ("error")
        return False
    login()
    

    【讨论】:

      【解决方案3】:

      如果第一行不匹配,您会立即返回 False,从而使循环短路。取消缩进这些行,以便在循环完成后调用它。 in 检查也不正确,我可以使用 username = ab 和 pw = 1 成功登录,尽管这不是完整的用户名或密码。

      def login():
          username = textentry.get()
          password = textentry2.get()
          database=open('database.txt')
          for line in database.readlines():
              usr, pas = line.strip().split("-")
              if (username == usr) and (password == pas):
                  credentialcheck.insert(END, "welcome")
                  return True
          credentialcheck.insert(END, "username or password incorrect")
          return False
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-12
        • 2016-01-01
        • 1970-01-01
        • 2014-07-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多