This will return the exception “ValueError: I/O operation on closed file”
def clear():
os.system('cls')
def openFile(operation):
global file
global writer
with open(r'C:\Users\UserDocuments\Proxy Database\Proxy.csv',operation, newline= '') as file:
writer = csv.writer(file)
while True:
dir = input('Enter Operation > ')
if dir == 'add':
openFile("a")
print('! Adding User !')
name = input('Enter Name > ')
writer.writerow([name])
print('User Added')
file.flush()
clear()
continue
I notice that when I put all the code under the initial CSV Open everything works fine, it just dosen’t work when put into a function.
with open(r'C:\Users\riccoDocuments\Proxy Database\Proxy.csv','r+', newline= '') as file:
writer = csv.writer(file)
while True:
dir = input('Enter Operation > ')
if dir == 'add':
print('! Adding User !')
name = input('Enter Name > ')
writer.writerow([name])
print('User Added')
file.flush()
break
print('Done')
Advertisement
Answer
It doesn’t work, because you did not put all of the pertinent code into the function.
You open the file in a with block inside your function. Then you exit the block (which closes the file), return from the function, and then your main program attempts to write to the closed file … hence the error message.
If you want to open the file in the function, but write to it in the calling routine, then you need a normal open, and have the function return the needed information. For instance:
def openFile(operation):
handle = open(r'C:\Users\UserDocuments\Proxy Database\Proxy.csv',operation, newline= '')
writer = csv.writer(handle)
return writer
...
writer = openFile("a")
...