2017-10-05 60 views
2

我需要这段代码的帮助,因为我不知道我在哪里出错了,因为我希望if语句先读取abc然后def后,然后它可以说授予访问权限。这是下面的代码:如何在python中读取.txt文件来处理新行的if语句?

file=open("test.txt","r") 
username = input("enter username") 
if file.read() == username: 
    print("Enter password") 
else: 
print("enter password") 
password = input() 
if file.read() == password: 
print ("acsess granted") 
else: 
    print ("access denied") 

这里是文本文件的内容:

abc 
def 

说我这个得到的问题是,它会一直输出access denied其中既ABC和DEF有分别在两条线上。我已经使用f.readlines()但是这也输出相同的消息。在代码中放置一个\n会导致此错误消息:

Traceback (most recent call last): 
    File "/Users/boys/Documents/test.py", line 8, in <module> 
    if file.read('\n') == password: 
TypeError: integer argument expected, got 'str' 

注:我必须有这个一个以上的用户名和密码,一个管理员用户名和管理员密码。

+0

我想你可能需要'file.readline()'。 –

+0

我已经完成了这项工作,但是它仍然会输出'访问被拒绝' –

+0

'file.readline()'包含尾部换行符吗?我不知道我的头顶,但那会导致这种行为。 –

回答

1

问题是readline()最后包含换行符(\n)。该splitlines()功能是解决此一个办法:

file=open("test.txt","r") 
text = file.read().splitlines() 
username = input("enter username") 
if text[0] == username: 
    print("Enter password") 
    password = input() 
    if text[1] == password: 
     print ("acsess granted") 
    else: 
     print ("access denied") 
else: 
    print("Wrong username!") 

编辑:我也是固定的逻辑,这样的密码不正确,但正确的用户名不再打印“已授权访问”(我认为不是OP的预期beahvior )。

+0

如果你这样做,你应该直接解包。 'f_user,f_pass = file.read()。splitlines()' –

+0

虽然它可能会更快地读取并映射到str.strip。 'f_user,f_pass = map(lambda s:s.rstrip(“\ n”),file.readlines())' –

+1

是的,这两个都是很好的建议。鉴于问题的性质,我试图提供最简单的答案。 –

0

我会对Brendan的帖子发表评论,但是我还没有足够的代表添加评论,所以我把这个问题扔到了答案中。

我建议的几个其他更正是使用RAW_INPUT()通过INPUT(),以便在输入信息时不需要包含引号。 RAW_INPUT假定一个字符串,而输入假定一个数字或变量,如果没有包括引号。

此外,您的第一个其他声明误导您(从验证的角度)。在测试你的代码时,你应该让他们说一些有点不同的东西,也许增加一个数字指示器来看看逻辑命中的语句的哪一部分。

+1

它是'raw_input()',假设用户使用Python 3,'input()'不需要引号来读取字符串。同意第一个'else'陈述是误导性的。在目前的逻辑下,用户可以使用错误的用户名而不是正确的密码来获得“访问授权”。 –

+0

好的。我已经纠正了上述情况。这是一个有趣的警告。由于我使用2.7,它仍然使用字符串,因此我上面的解释。 – sikrut

+0

我有,如果'如果'是正确的,那么它会打印出一个国会大厦E,如果没有,那么它会打印出一个小写字母e。 (也是我使用python 3.3和3.7) –

1

首先,您的代码存在安全问题 - 您的用户能够识别正确的用户名,但尚未输入密码

第二,它是一个有点复杂,所以我给你另外一个

with open("test.txt") as inp: 
    u_name = inp.readline() 
    p_word = inp.readline() 

username = input("Enter username: ") 
password = input("Enter password: ") 

if username == u_name.strip() and password == p_word.strip(): 
    print("Access granted") 
else: 
    print("Access denied") 

一些解释:

使用上下文管理with),而不是直接open() - 它安全在所有情况下关闭您的文件并为您提供其他优势。

"r"是默认值,所以您可以在open()函数中省略它。

strip()功能剥离空白符号(空格,制表符,换行符,...)从字符串的两端。