Как сделать так, чтобы программа Python читала строку в файле
У меня есть 2 файла, passwd и словарь. Пароль - это тестовый файл с одним словом, а в словаре есть список из нескольких строк слов. Моя программа до сих пор читает и сравнивает только первую строку файла словаря. Например. Файл моего словаря содержит (яйцо, рыба, красный, синий). Мой файл passwd содержит только (яйцо).
Программа работает очень хорошо, но как только я переключаю слово 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()
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:
..
Как только ваш внутренний цикл запустится один раз, он достигнет конца файла паролей. Когда внешний цикл достигает своей второй итерации, в файле паролей не остается ничего, чтобы прочитать, потому что вы не переместили указатель файла назад в начало файла.
Есть много решений проблемы. Ты можешь использовать seek
переместить указатель файла обратно в начало. Или вы можете прочитать весь файл паролей один раз и сохранить данные в списке. Или вы можете открыть файл на каждой итерации внешнего цикла. Выбор того, что лучше всего, зависит от характера данных (сколько строк, они на медленном сетевом ресурсе или на быстром локальном диске?) И каковы ваши требования к производительности.