【问题标题】:How do I make a .txt read in python to work with an if statement for a new line?如何在 python 中读取 .txt 以使用新行的 if 语句?
【发布时间】:2017-10-05 19:18:51
【问题描述】:

我需要有关此代码的帮助,因为我不知道我哪里出了问题,因为我希望 if 语句先读取 abc,然后再读取 def,这样它就可以说授予访问权限。下面是代码:

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'

注意:为此,我必须拥有多个用户名和密码,以及一个管理员用户名和管理员密码。

【问题讨论】:

  • 我想你可能想要file.readline()
  • 我已经这样做了,但是它仍然会输出'访问被拒绝'
  • file.readline() 是否包含尾随换行符?我不知道,但这会导致这种行为。
  • 什么意思?
  • 我的意思是file.readline() 可能会给出"abc" 或者它可能会给出"abc\n",我不确定没有仔细检查。

标签: python python-2.7 python-3.x


【解决方案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 的预期行为)。

【讨论】:

  • 如果你这样做,你应该直接解压。 f_user, f_pass = file.read().splitlines()
  • 虽然在 str.strip 上读取和映射 可能更快。 f_user, f_pass = map(lambda s: s.rstrip("\n"), file.readlines())
  • 是的,这两个都是很好的建议。鉴于问题的性质,我试图提供最简单的答案。
【解决方案2】:

首先,您的代码存在安全问题 - 您的用户无需输入密码即可识别正确的用户名

第二个,有点复杂,我再给你一个

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() 函数从字符串的两端去除空白符号(空格、制表符、换行符...)。

【讨论】:

    【解决方案3】:

    我会评论 Brendan 的帖子,但我仍然没有足够的代表来添加 cmets,所以我将其作为答案。

    我建议的其他一些更正是使用 RAW_INPUT() 而不是 INPUT(),这样您在输入信息时就不需要包含引号。 RAW_INPUT 假定为字符串,而 input 如果不包含引号则假定为数字或变量。

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

    【讨论】:

    • 它是raw_input(),假设用户使用的是 Python 3,input() 不需要引号来读取字符串。同意第一个 else 声明具有误导性。在当前逻辑下,用户可以通过错误的用户名但正确的密码获得“访问权限”。
    • 不错的收获。我已经在上面更正了。这是一个有趣的警告。由于我使用的是 2.7,它仍然对使用字符串很敏感,因此我在上面进行了解释。
    • 我有,如果'if'正确,那么它会打印出一个大写字母E,如果它不正确,那么它会打印出一个小写字母e。 (我也在使用 python 3.3 和 3.7)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    相关资源
    最近更新 更多