使用python cStringIO对关闭文件进行I/O操作



我有一个将数据写入内存的函数。我试图让数据达到一定的大小(在本例中为1gb),然后截断/转储到一个文件,并继续这个过程,直到没有更多的数据要写。目前,它将达到极限并截断它,然后根据我如何结束函数而以以下错误之一失败。

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

对如何完成这个过程有什么想法吗?作为参考,我相信你们中的许多人可以假设我想要截断内存到磁盘,所以我不会在内存中耗尽空间,所以函数可以继续运行,直到它完成。是否有可能创建由静态变量定义的随机变量名称来完成这一点(如果有意义的话)?

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

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

相关内容

  • 没有找到相关文章

最新更新