В вашем примере кода, когда эта строка достигнута (и вызывает ошибку):
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
, что является расточительным.
Обратите внимание, как с каждым примером код становится более читабельным и короче. Короче само по себе не очень хорошая вещь, но если ваш код становится легче читать и понимать, он работает лучше и короче сверху, вы знаете, что вы на правильном пути.