【问题标题】:How can I make Python program read line in file如何使 Python 程序读取文件中的行
【发布时间】:2015-03-23 17:35:30
【问题描述】:

我有 2 个文件,密码和字典。 passwd 是一个包含一个单词的测试文件,而字典有一个包含几行单词的列表。到目前为止,我的程序只读取和比较字典文件的第一行。例如。我的字典文件包含(鸡蛋、鱼、红色、蓝色)。我的 passwd 文件只包含 (egg)。

程序运行得很好,但是一旦我将字典文件中的单词 egg 切换到列表中的最后一个,程序就不会读取它并且不会拉出结果。

我的代码如下。

#!/usr/bin/passwd

import crypt

def testPass(line):
    e =  crypt.crypt(line,"HX")
    print e

def main():
    dictionary = open('dictionary', 'r')
    password = open('passwd', 'r')
    for line in dictionary:
        for line2 in password:
            if line == line2:
                testPass(line2)
    dictionary.close()
    password.close()

main()

【问题讨论】:

  • 那个#!/usr/bin/passwd shebang是故意的吗?
  • 向右看,您会看到“相关问题”部分。这些问题已经有了您正在寻找的答案。
  • 不,感谢您指出这一点,之前没有注意到。

标签: python linux dictionary passwords crypt


【解决方案1】:

一旦你的内部循环运行一次,它就会到达密码文件的末尾。当外循环达到第二次迭代时,密码文件中没有任何内容可读取,因为您没有将文件指针移回文件的开头。

这个问题有很多解决方案。您可以使用seek 将文件指针移回开头。或者,您可以读取整个密码文件一次并将数据保存在列表中。或者,您可以在外循环的每次迭代中重新打开文件。最佳选择取决于数据的性质(有多少行,它们是在慢速网络共享还是在快速本地磁盘上?)以及您的性能要求。

【讨论】:

    【解决方案2】:

    如果你这样做

    for line in file_obj:
      ....
    

    您正在隐式使用文件的readline 方法,每次调用都会推进文件指针。这意味着第一次完成内部循环后,将不再执行,因为没有更多的行可以读取。

    一种可能的解决方案是使用readlines 在内存中保留一个(最好是较小的)文件。这样,您可以对从另一个文件中读取的每一行进行迭代。

    file_as_list = file_obj.readlines()
    for line in file_obj_2:
      for line in file_as_list:
        ..
    

    【讨论】:

    • 你的灵魂奏效了!!!!像在一行代码中添加 .readlines() 这样简单的事情!
    猜你喜欢
    • 2017-11-01
    • 1970-01-01
    • 2018-10-22
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    相关资源
    最近更新 更多