WindowsError: [Ошибка 32] Процесс не может получить доступ к файлу, поскольку он используется другим процессом: 'new.dat'
Ниже приведена вся моя программа... я просто не знаю, где я ошибаюсь, она продолжает говорить, что этот процесс используется каким-то другим файлом... Я просто не понимаю, пожалуйста, помогите мне, когда мне нужно представить это в течение двух дней
import os
import pickle
password=123
l=input("Enter Password :")
if l==password:
print"--------Welcome Admin--------"
class new:
def __init__(self,a,b,c):
self.acno=a
self.acna=b
self.ini=c
def display(self):
print self.acno,self.acna,self.ini
def form(): # creating new account holders
print" ---New Account Entry Form--- "
n=input("Enter the no. Forms")
f1=open("new.dat","ab")
for i in range (n):
a=input("Enter The Account No:")
b=raw_input("Enter The Name of The Account Holder:")
c=input("Enter The Initial Amount (>=5000 ):")
if c<5000:
print "Initial Amount Too Low"
c=input("Enter The Initial Amount (>=5000 ):")
e=new(a,b,c)
pickle.dump(e,f1)
f1.close()
print"--------Account Created Successfully--------------"
def depo():#depositing amount in the account
print" ---- Account Deposition Form ---- "
p=input("Enter the Account Number:")
f1=open("new.dat","rb")
f2=open("dep.dat","wb")
amt=input("Enter the Amount to Deposit :")
try:
while True:
s=pickle.load(f1)
if s.acno==p:
s.ini+=amt
pickle.dump(s,f2)
except EOFError:
f1.close()
f2.close()
print"Amount Deposited Successfully"
os.remove("new.dat")
os.rename("dep.dat","new.dat")
def withdraw():#to withdraw
print " Account Transaction Form "
p=input("enter the account n:")
f2=open("new.dat","rb")
f3=open("f2.dat","wb")
amt=input("Enter the amount to Withdraw:")
try:
while True:
s=pickle.load(f2)
if s.acno==p:
if s.ini>amt or s.ini==amt :
s.ini-=amt
pickle.dump(s,f3)
print "Amount Withdrawed"
elif s.ini<amt:
print "No sufficient balance "
else:
print " Account no. invalid"
except EOFError:
f2.close()
f3.close()
os.remove("new.dat")
os.rename("f2.dat","new.dat")
def balance():#check the balance
print" Balance Amount Details"
p=input("Enter the Account Number:")
f3=open("new.dat","rb")
try:
while True:
s=pickle.load(f3)
if s.acno==p:
print "the Balance Amount for Acc. no. ",p,"is :", s.ini
except EOFError:
f3.close()
def displa():#display all the account holders
print " All Account Holders List "
f1=open("new.dat","rb")
try :
while True:
k=pickle.load(f1)
k.display()
except EOFError:
f1.close()
def dele(): # to delete the account holder error here
print " Account Deletion Form"
f1=open("new.dat","rb")
f2=open("tnew.dat","wb")
try:
e=pickle.load(f1)
no=input("Enter the Account No:")
if e.acno!=no:
pickle.dump(e,f2)
except EOFError:
f2.close()
f1.close()
os.remove("new.dat") #error here
os.rename("tnew.dat","new.dat") # error here
f1.close()
while True:
print"-----------------------------------------------------------------------------------------------------------------"
print" Bank Management System"
print" "
print"---Main Menu--- :"
print"1. New account"
print"2. Deposit amount"
print"3. Withdraw amount"
print"4. Balance account"
print"5. All Account Holders List "
print"6. Close An Account"
print"7. Exit"
choice=input("Enter Your Option (1-7):")
if choice==1:
form()
elif choice==2:
depo()
elif choice==3:
withdraw()
elif choice==4:
balance()
elif choice==5:
displa()
elif choice==6:
dele()
else:
print "-------Login In Later----------"
break
else:
print "PASSWORD Incorrect"
1 ответ
Пробовать f1=open("new.dat","rb")
а потом os.remove("new.dat")
не закрывая сначала; Вы не можете удалить его, и ошибка происходит, потому что файл находится в "другом процессе", другими словами, он читается
Вы никогда не должны открывать файл с f = open(filename, 'x')
а затем закрыть с f.close()
, это может создать проблемы точно так же, как у вас, если по какой-то причине программа не выполняет закрытие...
Вместо этого попробуйте переписать ваши функции, используя with open(filename, 'x') as f:
, он автоматически закрывает файл после завершения работы кода или при ошибке, не затрагивая программу
http://effbot.org/zone/python-with-statement.htm
В противном случае, если вы не хотите все испортить (обратите внимание, что ваши функции сохраняют файлы открытыми, если ошибка не возникает), попробуйте изменить каждый except EOFError:
блокировать с finally:
, который, в конце концов, такой же, как использование with
,
Из источника:
"Конструкция try-finally гарантирует, что код под
finally
часть всегда выполняется, даже если код, который выполняет работу, не завершается."
Это должно обеспечить закрытие