140
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是一个字典,w并且c都是字符串。

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

ValueError: I/O operation on closed file.
4

6 回答 6

203

正确缩进;您的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
于 2013-09-23T06:09:02.793 回答
8

通过混合可以引发相同的错误:制表符 + 空格。

with open('/foo', 'w') as f:
 (spaces OR  tab) print f       <-- success
 (spaces AND tab) print f       <-- fail
于 2018-03-26T21:43:14.357 回答
0

另一个可能的原因是,在一轮 copypasta 之后,您最终读取了两个文件并为两个文件句柄分配了相同的名称,如下所示。注意嵌套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

于 2022-01-09T20:59:41.487 回答
0
file = open("filename.txt", newline='')
for row in self.data:
    print(row)

将数据保存到一个变量(file),所以你需要一个with.

于 2020-12-14T08:27:02.097 回答
-1

我在 PyCharm 中调试时遇到了这个异常,因为没有遇到断点。为了防止它,我在with块之后添加了一个断点,然后它就停止了。

于 2020-12-02T22:07:00.093 回答
-1

当我在with open(...) as f:. 我删除(或我在外部定义)未定义的变量,问题就消失了。

于 2021-02-26T16:27:06.747 回答