Невозможно записать в двоичный файл, используя Python для pickle - PullRequest
0 голосов
/ 02 января 2019

Итак, у меня возникла проблема, когда я пытаюсь записать словарь в двоичный файл, и ничего не происходит.Очень странно;нет сообщения об ошибке, ничего.Это как программа пропускает код, а именно этот код

with open("database.dat", "wb") as handle:
        pickle.dump(d, handle)
        handle.close()

У меня нет проблем с загрузкой из этого файла database.dat, если он существует, но, похоже, этот код не создает новый двоичный файл, если онне существует и не перезаписывает файл, если он существует.У меня никогда не было этой проблемы, поэтому я озадачен ...

Чтобы дать представление о том, где это подходит, вот эта функция:

import pickle

def initialise_database(directory, file_name):

    try:
        with open("database.dat", "rb") as handle:
            d = pickle.load(handle) # THIS WORKS PERFECTLY
            handle.close()
            return d

    except FileNotFoundError:
        return update_database(directory, file_name)


def update_database(directory, file_name):
    import xlrd, os

    # Change directory
    os.chdir(directory)

    try:
        wb = xlrd.open_workbook(file_name)

        sheet = wb.sheet_by_name("FUNDS")

        rows, cols = sheet.nrows, sheet.ncols

        d = {}
        for i in range(rows - 1):
            if sheet.cell_value(i + 1, 0) != "":
                charity = cap(sheet.cell_value(i + 1, 0))

                area_of_work = []
                org = []
                funding = 0

                for x in range(cols):
                    if sheet.cell_value(0, x) == "Area of work":
                        if sheet.cell_value(i + 1, x) != "":
                            area_of_work.append(cap(sheet.cell_value(i + 1, x)))
                        else:
                            pass

                    elif sheet.cell_value(0, x) == "Organisation funded":
                        if sheet.cell_value(i + 1, x) != "":
                            org.append(cap(sheet.cell_value(i + 1, x)))
                        else:
                            pass


                    elif sheet.cell_value(0, x) == "How much funding provided":
                        funding = (str_to_int(sheet.cell_value(i + 1, x)))

                        if funding is False:
                            print("\nCharity " + str(sheet.cell_value(i + 1, 0)) + ", number " + str(i + 2) + " has funding of value: "+ str(funding) + ", which is not compatible. Please find it and fix it in the the excel file. Then try again")
                            return False

                # Adds entry to dictionary
                d[charity] = [area_of_work, org, funding]

            else:
                pass

        # After the loop has finished, it should write the entire dictionary to a newly created file!

        with open("database.dat", "wb") as handle:
            pickle.dump(d, handle)
            handle.close()

        return d

    except FileNotFoundError:
        print("File could not be found.")
        print("Program terminating.\n\nPress the enter key to exit.")

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

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

print(initialise_database( #my_directory, #my_file )

Он распечатывает мою базу данныхЭто означает, что вызывается функция update (), так как такого файла database.dat нет нигде

В качестве доказательства того, что файл не отображается, приведен скриншот.Это после запуска full_script (откуда взят этот код).

Evidence there is no file

1 Ответ

0 голосов
/ 02 января 2019

Я бы изменил:

# Change directory
os.chdir(directory)
wb = xlrd.open_workbook(file_name)

будет:

import os.path

wb = xlrd.open_workbook(os.path.join(directory, file_name))

таким образом, «рабочий каталог» не изменится, и ваши файлы окажутся там, где вы ожидаете.

, чтобы объяснить немного: всякий раз, когда вы open() файл (это то, что Python заканчивает вызывать, как xlrd или любой другой нативный код). пути, которые не начинаются с / (или \ в Windows), относятся к вашему «текущему рабочему каталогу» (CWD) или просто рабочему каталогу / папке. ваш CWD будет унаследован от программы, которая запустила ваш код (например, ваша оболочка или IDE), но вы можете изменить его программно, как вы делали, используя os.chdir.

Как правило, я избегаю смены каталога, так как это приводит к путанице (как вы уже видели), и просто использую пути, которые попадают в нужное место. в интернете есть много лучших документов об этом. У Microsoft есть документ под названием Имена файлов, путей и пространств имен , в котором есть все подробности, и, как правило, это проще в Unix / Linux. попробуйте поискать «относительные или абсолютные» пути и выяснить, что означает ...

...