我有2个文件,passwd和字典。 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()
答案 0 :(得分:1)
如果你这样做
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:
..
答案 1 :(得分:0)
一旦内部循环运行一次,它将到达密码文件的末尾。当外循环到达第二次迭代时,密码文件中没有任何内容可读,因为您没有将文件指针移回文件的开头。
这个问题有很多解决方案。您可以使用seek
将文件指针移回开头。或者,您可以读取整个密码文件一次,并将数据保存在列表中。或者,您可以在外循环的每次迭代中重新打开该文件。选择哪个最好取决于数据的性质(有多少行,它们是慢速网络共享还是快速本地磁盘?)以及您的性能要求。