ValueError:在关闭的文件上进行了I/O操作。

162
import csv    

with open('v.csv', 'w') as csvfile:
    cwriter = csv.writer(csvfile, delimiter=' ', quotechar='|', quoting=csv.QUOTE_MINIMAL)

for w, c in p.items():
    cwriter.writerow(w + c)

这里,p是一个字典,wc都是字符串。

当我尝试写入文件时,它报告了错误:

ValueError: I/O operation on closed file.
7个回答

225

正确缩进:你的for语句应该在with块内。

import csv    

with open('v.csv', 'w') as csvfile:
    cwriter = csv.writer(csvfile, delimiter=' ', quotechar='|', quoting=csv.QUOTE_MINIMAL)

    for w, c in p.items():
        cwriter.writerow(w + c)

with块外,文件已关闭。

>>> with open('/tmp/1', 'w') as f:
...     print(f.closed)
... 
False
>>> print(f.closed)
True

10

相同的错误可能由于混合使用制表符和空格而引起。

with open('/foo', 'w') as f:
 (spaces OR  tab) print f       <-- success
 (spaces AND tab) print f       <-- fail

1
对,但在Python中混合它们总是如此,对吧? - Nebulosar

1
我也有同样的问题。 这是我的之前的代码。
csvUsers = open('/content/gdrive/MyDrive/Ada/Users.csv', 'a', newline='', encoding='utf8')
usersWriter = csv.writer(csvUsers)
for t in users:
    NodeWriter=.writerow(users)
csvUsers.close() 

显然,我应该编写usersWriter而不是NodeWriter。
NodeWriter=.writerow(users)
usersWriter=.writerow(users)

以下是我的当前代码,它正在工作

csvUsers = open('/content/gdrive/MyDrive/Ada/Users.csv', 'a', newline='', encoding='utf8')
usersWriter = csv.writer(csvUsers)
for t in users:
    usersWriter=.writerow(users)
csvUsers.close() 

NodeWriter=.writerow(users) 不是语法错误吗?=. 不在任何 Python 语法中,对吧? - Robin De Schepper

0

另一个可能的原因是,在一轮复制粘贴后,您最终读取了两个文件并将相同的名称分配给这两个文件句柄,如下所示。请注意嵌套的with open语句。

with open(file1, "a+") as f:
    # something...
    with open(file2, "a+", f):
        # now file2's handle is called f!

    # attempting to write to file1
    f.write("blah") # error!!

修复方法是为两个文件句柄分配不同的变量名,例如使用f1f2而不是f

0

我在使用 with open(...) as f: 时遇到了一个未定义变量的问题。 我移除了(或者我在外部定义了)这个未定义变量,问题就消失了。


0
file = open("filename.txt", newline='')
for row in self.data:
    print(row)

将数据保存到变量(file)中,因此您需要使用with


0
我在使用auto-py-to-exe编译我的程序后遇到了类似的问题。
我使用了with open(link, "rb") as f:,但是改用PdfReader方法解决了问题。
只是想分享一下,以防其他人也遇到这个问题。
# it diesn't work --> ValueError: I/O operation on closed file.
     for link in links:
                if os.path.isfile(link):
                    with open(link, "rb") as f:
                    pdf_reader = PyPDF2.PdfReader(f)
            pdf_exporter.write("C:\\Temp\\test.pdf")
            os.startfile("C:\\Temp\\test.pdf")

# it does
     for link in links:
                if os.path.isfile(link):
                    # with open(link, "rb") as f:
                    # pdf_reader = PyPDF2.PdfReader(f)
                    pdf_reader = PyPDF2.PdfReader(link)
            pdf_exporter.write("C:\\Temp\\test.pdf")
            os.startfile("C:\\Temp\\test.pdf")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接