Проверка наличия строки в файле - PullRequest
0 голосов
/ 24 сентября 2018

Я делаю программу, которая проверяет, есть ли какие-либо пользовательские данные в файле.Если пользовательский ввод в данный момент отсутствует в файле, мы добавим этот ввод в файл used_passwords и попросим пользователя ввести еще что-нибудь еще.иначе, если они повторно вводят ввод, который мы только что добавили (или любой из пресетов), то мы хотим сказать им, что они не могут повторно использовать пароль.

Проблема, с которой я сталкиваюсь с этим кодом, состоит в том, что всякий раз, когда явведите букву из слова в файле used_passwords или, если я введу часть слова в файле, программа сообщит мне, что я не могу повторно использовать пароль.

Например: если я набираюв «abc» программа сообщит мне, что я уже повторно использовал этот пароль, и я предполагаю, что это, вероятно, потому, что программа считывает файлы символьно и читает abc в abcdeF! 23.

Хотя,Я не хочу, чтобы программа сообщала мне, что я не могу повторно использовать a или несколько символов из файла.Я хочу, чтобы программа сказала мне, что я не могу повторно использовать слово из программы


Мне также интересно, могли бы мы поместить входные данные или пресеты в массив В ФАЙЛЕ.

fileUsed_Pass = open("used_passwords.txt", 'a')

fileUsed_Pass.write("\nabcdeF!23")
fileUsed_Pass.write("\n\n")

fileUsed_Pass.write("zxcbhK#44")
fileUsed_Pass.write("\n\n")

fileUsed_Pass.write("poiuyT&11")
fileUsed_Pass.write("\n\n")

fileUsed_Pass.close()



def password():

    string = input("Enter Here:")

    if string in open('used_passwords.txt').read():
        print("You can not reuse that password!\n")
        password()
    else:
        # file-append.py
        f = open('used_passwords.txt','a')
        f.write('\n'+string)
        f.close()
        password()
password()

ОБНОВЛЕНИЕ : Я получил код для работы с использованием оператора with.

вместо использования оператора If и else, я использовал оператор with.

Здесь я проверяю каждую строку на наличие текста, соответствующего моей входной строке.Если их нет, тогда мы сделаем some_variable равным True.Если это не так, то мы сделаем его равным ложному.

with open("used_passwords.txt", 'r') as tFile:
    for line in tFile:
      if string != line and string+"\n" != line:
        some_variable = True
      else:  #If it equals anything else from the file, then false
        some_variable = False
        break


  #print(some_variable)
  #this was added for me/the user to make sure that the with statement was working

Впоследствии, если оно будет равно True: мы добавим его в файл.Если этого не произойдет, мы заставим пользователя ввести другой пароль, который не совпадает ни с одним из указанных в файле.

  tFile = open("used_passwords.txt", 'a')
  if some_variable == True:
    tFile.write("\n" + string)
    print("\nGOOD! Password does not match old ones!")

  elif some_variable == False:
    print("\nYou can not re-use a password!")
    password()

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

Вы используете .read (), который читает весь файл как одну строку.

word = 'abc'

for line in open('file.txt').readlines():
    if word in line:
        return True

Используйте взамен .readlines () и просматривайте каждую строку, чтобы проверить, находится ли строка в любом изстроки файла.

0 голосов
/ 24 сентября 2018

Работа непосредственно с текстовыми файлами, вероятно, не самое лучшее решение;вместо этого вам следует рассмотреть возможность использования какой-либо формы базы данных (например, библиотеки sqlite3 , которая, IIRC, поставляется с предустановленной Python3).

Кроме того, имейте в виду, что хранение паролей в виде открытого текста являетсябезопасность "нет-нет".По крайней мере, используйте одну из многих доступных криптографических хеш-функций , затем сохраните и сравните хешей , а не пароли.

Вот базовый пример, который используети sqlite3, и SHA-256 , общая функция хеширования:

#!/usr/bin/python3

import sqlite3
import hashlib

db  = sqlite3.connect( "used_passwords.db" )
cur = db.cursor()
cur.execute( "CREATE TABLE IF NOT EXISTS passwords( pwd TEXT, UNIQUE( pwd ))" )

def password():
   pwd = input( "password: " )
   sha = hashlib.sha256( pwd.encode( 'utf-8' )).hexdigest()
   cur.execute( "INSERT INTO passwords VALUES( ? )", ( sha, ))

while True:
   try:
      password()
      break
   except KeyboardInterrupt:
      print( "aborted" )
      break
   except sqlite3.IntegrityError:
      print( "cannot reuse that password" )

db.commit()
db.close()

Обратите внимание на ограничение UNIQUE для pwd, которое гарантирует, что исключение sqlite3.IntegrityError вызывается всякий раз, когдапароль уже присутствует в passwords (это делает проверку неявной и минимизирует громоздкость SQL).

Пример использования:

% ./pwd.py 
password: foo
% ./pwd.py 
password: foo
cannot reuse that password
password: bar
%

Вы можете убедиться, что пароль в виде открытого текста не появляетсяв базе данных:

% sqlite3 ./used_passwords.db 
SQLite version 3.16.2 2017-01-06 16:32:41
Enter ".help" for usage hints.
sqlite> select * from passwords;
2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae  ; <- this is "foo"
fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9  ; <- this is "bar"
sqlite> 

Конечно, вы можете расширить это и добавить дополнительные функции, такие как поддержка нескольких пользователей, срок действия пароля и т. д. ...

0 голосов
/ 24 сентября 2018

Учитывая, что вы добавляете \ n после каждого пароля, который вы вводите в файл, вы можете попытаться добавить \ n к переменной string и затем выполнить поиск по ней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...