Python: удаление повторяющихся строк и соблюдение определенных параметров - PullRequest
0 голосов
/ 18 марта 2020

В настоящее время я разрабатываю базу данных учетных данных, предназначенную для хранения имени сервера, имени пользователя и пароля в текстовом файле. Тем не менее, для имени сервера и паролей я пытаюсь сделать их уникальными (никакие два учетных данных / логина не могут иметь одинаковое имя сервера и пароль, имена пользователей могут дублироваться).

Например,

# This is NOT acceptable because the servername is duplicated.
servername : username : password
google : john : 123
google : john : 321

# This is acceptable because the servername and password are unique.
servername : username : password
google : john : 123
yahoo : john : 321

Я искал stackoverflow для некоторых ответов, но мне не удалось найти именно то, что я ищу. В текущем состоянии моей программы, когда вводятся учетные данные, они просто перечисляются прямо под существующим и продолжают добавлять все дополнительные учетные данные без проверки на наличие дубликатов.

# Creates the file "passdatabase.txt" for use with this code.
with open('passdatabase.txt', 'a+') as searchfile:
    searchfile.close()

# Here I initialize the variable / count for the while loop
x = 1

print("\n======================="+
      "\nYou chose to add a credential."
      "\n-----------------------")
# User enters in a server name to be saved.
addservername = input("Server Name: ")
# User enters in a username to be saved.
addusername = input("Username: ")
# User enters in a password to be saved.
addpassword = input("Password: ")
# All inputs are combined to create a single variable in the format (servername : username : password)
addCredential = addservername + " : " + addusername + " : " + addpassword

# Loops until the user enters a valid submission (either [y] or [n]) to confirm information.
while x == 1:
    # Input information is displayed for user to confirm.
    confirmCredential = input("~~~~~~~~~~~~~~~~~~~~~~~" +
                              "\nPlease verify the entered credentials.\n" +
                              "\nServer Name: [" +
                              addservername + "]" +
                              "\nUsername: [" +
                              addusername + "]" +
                              "\nPassword: [" +
                              addpassword + "]" +
                              "\n\nIs the information correct? (y/n): ")
    print("~~~~~~~~~~~~~~~~~~~~~~~")
    if confirmCredential == "y":
        x = 2
        with open('passdatabase.txt', 'r') as searchfile:
            lines_seen = set(open('passdatabase.txt'))
            for addCredential in (searchfile, 1):
                if addCredential not in lines_seen:
                    with open('passdatabase.txt', 'a+') as searchfile:
                        # I set the format of the credential to save in the text file as
                        # servername : username : password.
                        searchfile.write("\n" + addservername + " : " + addusername + " : " + addpassword)
                        print("[!] SUCCESS! Your credentials have successfully been stored [!]" +
                              "\n=======================")
                        # This breaks the for loop so it does not continue the code.
                        break
                else:
                    print('Duplicate credential detected!')
    elif confirmCredential == "n":
        x = 2
        print("[!] Your credentials have not been stored [!]" +
              "\n=======================")
    else:
        print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" +
              "\n[!!!ERROR!!!] PLEASE ENTER EITHER [y] OR [n]. [!!!ERROR!!!]\n" +
              "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")

Мои вопросы / запросы в одном простом списке следующим образом:
- Как я могу гарантировать, что пользователь может вводить только уникальные записи для своих учетных данных имени сервера и пароля при разрешении дублирования записей имени пользователя?
- Если обнаружен дубликат, я бы например, код, чтобы остановить дальнейшее продвижение и снова запрашивать ввод у пользователя, пока не будут предоставлены надлежащие уникальные учетные данные. Я должен использовать набор или массив? (Порядок данных не имеет значения)
- Я видел довольно много дублирующих скриптов проверки, которые включают использование 2 .txt файлов, возможно ли это только с 1?
- В будущем я планирую добавить шифрование записей пароля, проверка надежности пароля и, возможно, журнал учетных данных (о том, кто вошел в систему).
- Любые входные данные приветствуются, поскольку я всегда готов их изучить!

Я довольно новичок в Python кодирования, и мне бы очень хотелось, чтобы некоторые указания о том, что я должен смотреть дальше, я, честно говоря, не уверен, если я даже движусь в правильном направлении.
Спасибо

1 Ответ

0 голосов
/ 18 марта 2020

Возможно, вам следует использовать sqlite вместо чистого текстового файла.

Если вы действительно хотите реализовать функцию базы данных в текстовом файле:

Используйте set для кортежа (имя сервера, пароль), проверьте наличие, прежде чем добавлять в файл. Не забудьте загрузить все существующие из вашего текстового файла, прежде чем попросить пользователя ввести.

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

...