好的,所以我有一个将数据写入内存的函数。我试图让数据达到设定大小(在这种情况下为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。

关于python - ValueError:使用python cStringIO对关闭的文件进行I/O操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14027472/

10-13 01:48