Проверьте данные в файле - PullRequest
0 голосов
/ 20 марта 2019

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

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

В любом случае, вот весь мой код.

import sys
import os

err = {}
PATH = 'C:/users/userdefault/desktop/errordb.txt'

#def open_file():  #Not yet used
    #file_read = open(PATH, 'r')
    #return file_read

def verify_error(error_number, loglist): #Verify if error exists in file
    for error in loglist:
        if error_number in loglist:
            return True


def dict_error(error_number, solution): #Puts input errors in dict
    err = {error_number: solution}
    return err

def verify_file(): #Verify if file exists. Return True if it does
    archive = os.path.isfile(PATH)
    return archive

def new_error():
    file = open(PATH, 'r') #Opens file in read mode
    loglist = file.readlines()
    file.close()
    found = False
    error_number = input("Error number: ")
    if verify_error(error_number, loglist) == True:
        found = True
        # Add new solution, or another solution.
        pass
    solution = str(input("Solution: "))
    file = open(PATH, 'a')
    error = dict_error(error_number, solution)
    #Writes dict on file
    file.write(str(error))
    file.write("\n")
    file.close()

def main():
    verify = verify_file() #Verify if file exists
    if verify == True:
        new = str.lower(input("New job Y/N: "))
        if new == 'n':
            sys.exit()
        while new == 'y':
            new_error()
            new = str.lower(input("New job Y/N: "))
        else:
            sys.exit()
    else:
        file = open(PATH, "x")
        file.close()
        main()

main()

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

Заранее спасибо:)

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Я считаю, что проблема заключается в том, что вы на самом деле не создаете dictionary object в файле и не изменяете его, а вместо этого создаете дополнительные словари при каждом добавлении ошибки, а затем читаете их как список строки с использованием метода .readlines().

Более простой способ сделать это - создать dictionary, если он не существует, и добавить к нему ошибки. Я сделал несколько изменений в вашем коде, которые должны помочь.

import sys
import os
import json  # Import in json and use is as the format to store out data in

err = {}
PATH = 'C:/users/userdefault/desktop/errordb.txt'

# You can achieve this by using a context manager
#def open_file():  #Not yet used
    #file_read = open(PATH, 'r')
    #return file_read

def verify_error(error_number, loglist): #Verify if error exists in file
    # Notice how we're looping over keys of your dictionary to check if
    # an error already exists.
    # To access values use loglist[k]
    for k in loglist.keys():
        if error_number == k:
            return True
    return False

def dict_error(loglist, error_number, solution): #Puts input errors in dict
    # Instead of returning a new dictionary, return the existing one
    # with the new error appended to it 
    loglist[error_number] = solution
    return loglist

def verify_file(): #Verify if file exists. Return True if it does
    archive = os.path.isfile(PATH)
    return archive

def new_error():

    # Let's move all the variables to the top, makes it easier to read the function
    # Changed made:
    # 1. Changed the way we open and read files, now using a context manager (aka with open() as f:
    # 2. Added a json parser to store in and read from file in a json format. If data doesn't exist (new file?) create a new dictionary object instead
    # 3. Added an exception to signify that an error has been found in the database (this can be removed to add additional logic if you'd like to do more stuff to the error, etc)
    # 4. Changed the way we write to file, instead of appending a new line we now override the contents with a new updated dictionary that has been serialized into a json format
    found = False
    loglist = None

    # Open file as read-only using a context manager, now we don't have to worry about closing it manually
    with open(PATH, 'r') as f:
        # Lets read the file and run it through a json parser to get a python dictionary
        try:
            loglist = json.loads(f.read())
        except json.decoder.JSONDecodeError:
            loglist = {}

    error_number = input("Error number: ")
    if verify_error(error_number, loglist) is True:
        found = True
        raise Exception('Error exists in the database')  # Raise exception if you want to stop loop execution
        # Add new solution, or another solution.

    solution = str(input("Solution: "))
    # This time open in write only and replace the dictionary
    with open(PATH, 'w') as f:
        loglist = dict_error(loglist, error_number, solution)
        # Writes dict on file in json format
        f.write(json.dumps(loglist))

def main():
    verify = verify_file() #Verify if file exists
    if verify == True:
        new = str.lower(input("New job Y/N: "))
        if new == 'n':
            sys.exit()
        while new == 'y':
            new_error()
            new = str.lower(input("New job Y/N: "))
        else:
            sys.exit()
    else:
        with open(PATH, "x") as f:
            pass
        main()

main()

Обратите внимание, что для работы этого фрагмента вам нужно будет создать новый файл errordb.

Надеюсь, это как-то помогло. Если у вас есть дополнительные вопросы, напишите мне в комментариях!

Ссылки:

0 голосов
/ 20 марта 2019

Я думаю, что может быть несколько проблем с вашим кодом, но первое, что я заметил, было то, что вы сохраняете Номера ошибок и Решения как словарь в errorsdb.txt и когда вы читаете их обратно, вы читаете их обратно как список строк:

Линия:

loglist = file.readlines()

in new_error возвращает список строк. Это означает, что verify_error всегда будет возвращать False.

Итак, у вас есть несколько вариантов:

  1. Вы можете изменить verify_error на следующее:
def verify_error(error_number, loglist): #Verify if error exists in file
    for error in loglist:
        if error_number in error:
            return True
  1. Хотя, я думаю, что лучшим решением было бы загрузить errorsdb.txt в виде файла JSON, и тогда у вас будет словарь. Это будет выглядеть примерно так:
import json

errordb = {}
with open(PATH) as handle:
    errordb = json.load(handle)

Итак, вот полный набор изменений, которые я бы сделал:

import json

def verify_error(error_number, loglist): #Verify if error exists in file
    for error in loglist:
        if error_number in error:
            return True

def new_error():
    errordb = list()
    exitsting = list()
    with open(PATH) as handle:
        existing = json.load(handle)

    errordb += existing

    error_number = input("Error number: ")
    if verify_error(error_number, errordb) == True:
        # Add new solution, or another solution.
        print("I might do something here.")
    else:
        solution = str(input("Solution: "))
        errordb.append({error_number, solution})

    #Writes dict on file
    with open(PATH, "w") as handle:
        json.dump(errordb, handle)

...