为什么这个发现和阅读线不起作用?

时间:2017-01-17 18:44:23

标签: python python-3.x

我已经查看了其他问题,并了解了如何在文本文件中找到单词所在的行,但在我的代码中使用它时,它并没有按照我的意愿去做。

 while x == "i" :
  print ("Please Enter Your Usename And Pasword!")
  luser = input("USERNAME - ")
  Lpass = input("PASSWORD - ")
  with open("USERNAME.txt") as ucc:
   for num, line in enumerate(ucc, 1):
    if luser in line:
     print (int(num))

  uc = open( "USERNAME.txt", "r")
  pc = open( "PASSWORD.txt", "r")

  u = uc.readline(int(num))
  pw = pc.readline(int(num))
  print (u)
  print (pw)

所以我运行它并输入我在我的注册程序中使用的用户名,它的意思是检查它所在的行,以便它知道哪个密码与它配对。但由于某种原因,readline位不知道要读取什么行来设置变量。

2 个答案:

答案 0 :(得分:1)

正如评论者所指出的那样,readline()不会将行号作为参数。读取特定行的一种方法是遍历文件,直到到达所需的行。

with open("USERNAME.txt", "r") as fp:
    for i, line in enumerate(fp, start=1):
        if i == num:
            u = line
            break

with open("PASSWORD.txt", "r") as fp:
    for i, line in enumerate(fp, start=1):
        if i == num:
            pw = line
            break

逐行说明:

with open("USERNAME.txt", "r") as fp:

以读取模式打开USERNAME.txt文件(由r表示)并将其file object分配给名为fp的变量。

    for i, line in enumerate(fp, start=1):

通常,如果我们想逐行循环遍历文件,我们就可以

    for line in fp:

但是,我们需要知道与每一行关联的行号,以便我们可以找到特定的行。 enumerate()让我们将每一行与分配给变量i的行号相关联。 start=1中的enumerate()参数指定i将从1开始,而不是默认0

简而言之,这句话说我们将绕过fp中的行并在我们去的时候计算它们。

        if i == num:

我们的for循环将遍历文件中的每一行,但我们只关心使用我们的用户名/密码的行。在这里,我们检查当前行号i是否是我们正在寻找的行号。

            u = line

如果是我们要查找的行号,我们会将u变量设置为该行的内容。

            break

退出循环的关键字。在找到我们要查找的行之后,我们不需要浏览文件的其余部分,因此我们break可以节省时间。

答案 1 :(得分:1)

您可以使用linecache标准库的模块直接转到特定行 PS无需打开文件

line = linecache.getline(file, num)

适合您的情况

import linecache

ucc = open("USERNAME.txt", "r")

while x == "i":
    print ("Please Enter Your Usename And Pasword!")
    luser = input("USERNAME - ")
    Lpass = input("PASSWORD - ")
    for num, line in enumerate(ucc, 1):
        if luser in line:
            pw = linecache.getline("PASSWORD.txt", num)
            print(line)
            print(pw)
            break