Я получаю несвязанную локальную ошибку при загрузке файла - PullRequest
0 голосов
/ 29 апреля 2020

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

1 Ответ

0 голосов
/ 30 апреля 2020

В вашем примере кода, когда эта строка достигнута (и вызывает ошибку):

tdc=open("D:/Python/deisel/collection.txt","rb+")

.. тогда следующая строка никогда не будет выполнена и fdl не будет иметь значения.

После ошибки выполнение продолжается после except EOFError and FileNotFoundError: и достигается эта строка:

fdl.close()

Поскольку fdl никогда не определялся (так как эта строка была пропущена), он не имеет значения и это является причиной вашей ошибки.

Один из способов исправить это - разобраться с исключениями более чисто:

class SomeClass:
    def some_method(self, z1):
        # initialisation
        qa = 0
        kd = []
        k1 = []
        try:
            tdc = open("D:/Python/deisel/collection.txt","rb+")
            try:
                fdl = open("D:/Python/deisel/"+str(z1)+".txt","rb+")
                try:
                    try:
                        while True:
                            self.f1 = pickle.load(tdc)
                            self.fd = pickle.load(fdl)
                            k1.append(self.f1)
                            kd.append(self.fd)
                    except EOFError:
                        pass  # no message needed, but not the nicest way to use the exception
                    for i in kd:
                        if "L" in i:
                            # this bit makes no sense to me, but it's not relevant
                            qa1 = i[:-1]
                            qa = qa + int(qa)
                        else:
                            qa = qa + int(i[0])
                    print(" Total Collection for Deisel on date ", z1, "is", qa)
                finally:
                    tdc.close()
                    fdl.close()
            except FileNotFoundError:
                tdc.close()  # this is open, closing it
                pass  # some error message perhaps?
        except FileNotFoundError:
            pass  # some error message perhaps?

Это лучше, но не очень Pythoni c и только иллюстрирует, как вы можете решить свою проблему - я совсем не рекомендую вам написать это.

Ближе к тому, что вам, вероятно, нужно:

import pickle


class SomeClass:
    def some_method(self, z1):
        # initialisation
        qa = 0
        kd = []
        k1 = []
        try:
            with open("D:/Python/deisel/collection.txt","rb+") as tdc:
            try:
                with open("D:/Python/deisel/"+str(z1)+".txt","rb+") as fdl:
                    try:
                        while True:
                            self.f1 = pickle.load(tdc)
                            self.fd = pickle.load(fdl)
                            k1.append(self.f1)
                            kd.append(self.fd)
                    except EOFError:
                        pass  # no message needed, but not the nicest way to use the exception
                    for i in kd:
                        if "L" in i:
                            # this bit makes no sense to me, but it's not relevant
                            qa1 = i[:-1]
                            qa = qa + int(qa)
                        else:
                            qa = qa + int(i[0])
                    print(" Total Collection for Deisel on date ", z1, "is", qa)
            except FileNotFoundError:
                pass  # some error message perhaps?
        except FileNotFoundError:
            pass  # some error message perhaps?

with делает именно то, что вы ' мы пытаемся сделать и очистить дескриптор файла, гарантировано.

И это все еще вызывает проблему получения нескольких файлов с одинаковыми значениями, без гарантии, что число файлов с одинаковыми значениями будет одинаковым для обоих - если вы напишите эти мариновать себя, почему бы не мариновать список объектов и избегать этого беспорядка?

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

import pickle
from pathlib import Path


class SomeClass:
    def some_method(self, z1):
        # initialisation
        qa = 0
        kd = []
        k1 = []
        fn1 = "D:/Python/deisel/collection.txt"
        fn2 = "D:/Python/deisel/"+str(z1)+".txt"

        if not Path(fn1).is_file() or not Path(fn2).is_file():
            return  # some error message perhaps?

        with open(fn1, "rb+") as tdc:
            with open(fn2, "rb+") as fdl:
                try:
                    while True:
                        # not using self.f1 and .fd, since it seems they are just local
                        # also: why are you loading k1 anyway, you're not using it?
                        k1.append(pickle.load(tdc))
                        kd.append(pickle.load(fdl))
                except EOFError:
                    pass  # no message needed, but not the nicest way to use the exception
                for i in kd:
                    if "L" in i:
                        qa1 = i[:-1]
                        qa = qa + int(qa)
                    else:
                        qa = qa + int(i[0])
                print(" Total Collection for Deisel on date ", z1, "is", qa)

Я не знаю об остальной части вашего кода, но вы, вероятно, могли бы также избавиться от исключения EOF, если бы вы обрабатывали предсказуемым образом, и кажется, что загрузка f1 в k1 служит только в качестве возможного ограничения на количество загружаемых элементов из kd, что является расточительным.

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

...