0

我正在尝试创建登录脚本。我在一个文本文件中有用户名和密码,我希望 python 读取并检查以查找用户名和密码。

我遇到的最大问题是将密码“附加”到用户名。我目前只能扫描整个文档,但不一定要相互连接。

#-------------------------------------------------------------------------------
# Name:        LogIn
# Purpose:      Logging In
#
# Author:      Dark Ariel7
#
# Created:     19/02/2013
# Copyright:   (c) Dark Ariel7 2013
# Licence:     I take no responsability for anything.
#-------------------------------------------------------------------------------
from getpass import getpass
from time import sleep
Database = open("C:\\Users\Dark Ariel7\\Desktop\\USB BAckup\\Scripts\\Database.txt", encoding='utf-8')
Username = ("")
Password = ()
def LogIn():
    Database = open("C:\\Users\Dark Ariel7\\Desktop\\USB BAckup\\Scripts\\Database.txt", encoding='utf-8')
    Data = (Database.read())
    Username = ("")
    Password = ()
    Username = input("Username: ")
    Password = getpass(str("Password: "))
    LogIn= ",".join((Username,Password))
    if LogIn in Data:
        print("Welcome, " + Username)
        sleep(3)
        pass
    else:
        print("Failed, Sucker!")
        sleep(5)
        exit()

LogIn()

如果你们能帮我弄清楚这到底.join是什么部分,那就太好了。我应该制作字典并将索引用于登录表吗?我还想要一些关于如何使代码更好的一般性反馈。

这是它将读取的 txt 文件:

[Dark Ariel7,123456]
[Poop,Anko]

*编辑对不起,我忘了提到我使用的是python 3而不是2。到目前为止谢谢。非常快速的回复。同样在最后一个 else 之后而不是 exit 我放什么以便函数循环直到我得到正确的用户名密码组合?

4

2 回答 2

0

您遇到的基本问题是您的文件包含[ ]用户名和密码组合,但您没有考虑到这一点。

您的代码还有一些其他的风格问题,这是一个经过编辑的版本:

import getpass
from time import sleep

password_file = r'C:\....\Database.txt'

def login(user,passwd):
   ''' Checks the credentials of a user '''
   with open(password_file) as f:
      for line in f:
          if line.strip(): # skips blank lines
              username,password = line.split(',') # this gets the individual parts
              username = username[1:] # gets rid of the [
              password = password[:-1] # the same for the password
              if user == username and password == passwd:
                  return True
   return False

if __name__ == '__main__':
    username = input('Please enter the username: ')
    passwd = getpass('Please enter the password: ')
    if login(user,passwd):
       print('Welcome {1}'.format(user))
       sleep(3)
    else:
       print('Failed! Mwahahaha!!')
       sleep(5)

首先,您不需要()“初始化”变量;更重要的是,在 Python 中,您根本不需要初始化变量。这是因为 Python 没有变量。而是指向事物的名称。

接下来,python 风格指南说变量名和方法名应该是小写的。

现在 - 代码的主要部分:

>>> username, password = '[username,sekret]'.split(',')
>>> username
'[username'
>>> password
'sekret]'

我曾经split()将这一行分成用户名和密码部分;[但正如你所看到的,事情仍然很混乱。接下来我这样做了:

>>> username[1:]
'username'
>>> password[:-1]
'sekret'

这使用切片表示法去除前导和结束字符,摆脱[ ].

这些行:

   with open(password_file) as f: # 1
      for line in f: # 2
          if line.strip(): # skips blank lines

请执行下列操作:

  1. 打开文件并将其分配给变量f(参见with语句的更多信息)

  2. 这个 for 循环遍历f中的每一行,并将名称分配给文件中的每一行。

  3. 第三部分确保我们跳过空行。strip()将删除所有不可打印的字符;因此,如果没有剩余字符,则该行是空白的并且会有一个0长度。因为 if 循环仅在条件为真且0假值时才起作用 - 实际上发生的情况是我们只对非空行进行操作。

代码的最后一部分是另一个 if 语句。这是一项检查,以确保当您从命令提示符执行该文件时该文件将运行。

于 2013-08-08T04:29:15.780 回答
0

“.join”部分将用户输入的用户名和密码用逗号连接起来(即 Poop、Anko),因为这是它存储在数据库中的格式,因此您可以通过这种方式进行搜索。

这是您的代码,经过了一些编辑,并带有一些关于功能和样式的评论。

from getpass import getpass
from time import sleep
Database = open("C:\\Users\Dark Ariel7\\Desktop\\USB BAckup\\Scripts\\Database.txt", encoding='utf-8')
# These next two lines aren't necessary - these variables are never used; you may want to read up about namespaces:  http://bytebaker.com/2008/07/30/python-namespaces/
#Username = ("")
#Password = ()
def LogIn():
    Database = open("C:\\Users\Dark Ariel7\\Desktop\\USB BAckup\\Scripts\\Database.txt", encoding='utf-8')
#   Removed the parentheses; they have no effect here.  Putting parens around lone statements doesn't have any effect in python.
    Data = Database.read()
#   These next two lines are pointless, because you subsequently overwrite the values you give these variables.  It looks like you're trying to "declare" variables, as you would in Java, but this isn't necessary in python.
#   Username = ("")
#   Password = ()
#   Changed this from "input" to "raw_input" because input does something else that you don't want.
    Username = raw_input("Username: ")
    Password = getpass(str("Password: "))
    LogIn= ",".join((Username,Password))
    if LogIn in Data:
        print("Welcome, " + Username)
#   Not sure why you want the script to sleep, but I assume you have your reasons?
        sleep(3)
#   no need to pass
#       pass
    else:
        print("Failed, Sucker!")
        sleep(5)
#   exit() isn't necessary - the function will end by itself.
#       exit()

LogIn()
于 2013-08-08T04:33:43.003 回答