Skip to main content
 首页 » 编程设计

python之值错误 : I/O operation on closed file with python cStringIO

2025年05月04日7虾米哥

好的,所以我有一个将数据写入内存的函数。我试图让数据达到设定的大小(在本例中为 1 GB),然后截断/转储到文件并继续执行此过程,直到不再有数据可写为止。目前它将达到限制并截断它然后失败并出现以下错误之一,具体取决于我如何结束函数。

Traceback (most recent call last): 
  File "<pyshell#192>", line 1, in <module> 
    cart_for(10,'1234567890') 
  File "<pyshell#191>", line 8, in cart_for 
    x.write(''.join(p)) 
ValueError: I/O operation on closed file 

我的职能是:

x = StringIO() 
def cart_for(n, seq): 
b = 8 
a = 100000 
size_max = 1073741824 
for m in range(n, b, -1): 
    a = a - 1 
    for p in itertools.product(seq, repeat=m-1): 
        x.write(''.join(p)) 
        x.write('\n') 
        x.seek(0, os.SEEK_END) 
        size = x.tell() 
        if size > size_max: 
            with open('C:/out/' + ran(8,string.ascii_letters) + '.txt', 'w') as handle: 
                handle.write(x.getvalue()) 
                x.close() 
                x 

如果我以以下方式结束我的功能:

x = StringIO() 

代替:

x 

现在的错误是:

Traceback (most recent call last): 
  File "<pyshell#189>", line 1, in <module> 
    cart_for(10, '1234567890') 
  File "<pyshell#188>", line 8, in cart_for 
    x.write(''.join(p)) 
UnboundLocalError: local variable 'x' referenced before assignment 

关于如何完成这个过程有什么想法吗?作为引用,我相信你们中的许多人都可以假设我想经常将内存截断到磁盘,这样我就不会用完内存中的空间,这样函数就可以继续运行直到它完成。是否可以创建由静态变量定义的随机变量名称来完成此操作(如果有意义的话)?请原谅我是 python 的新手。

请您参考如下方法:

您正在循环中使用 x,但您在第一次达到最大尺寸时关闭了它。下次循环时,StringIO 关闭,不能再使用。

您应该在函数内部而不是外部创建 StringIO。将 x = StringIO() 移到函数体内(在循环之前),然后将最后一行更改为 x = StringIO() 以便创建一个新的 StringIO每次你填满一个旧的。