2012-12-25 4 views
1

그래, 데이터를 메모리에 씁니다. 데이터를 크기 (이 경우에는 1GB)로 설정 한 다음 파일을 자르고/덤프하고이 데이터가 더 이상 쓸 데이터가 없을 때까지이 프로세스로 계속 진행하려고합니다. 현재 그것은 한계에 도달하고 그것을 잘라내는 다음 함수를 끝내는 방법에 따라 다음 오류 중 하나와 함께 실패합니다.ValueError : python으로 닫힌 파일에 대한 입출력 작업 cStringIO

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 

이 과정을 완료하는 방법에 대한 아이디어가 있으십니까? 나는 많은 사람들이 메모리를 디스크에 너무 자주 잘라서 메모리의 공간을 다 쓰지 않아도되기 때문에 함수가 완료 될 때까지 계속 실행될 수 있다고 생각할 수 있습니다. 이것을 완성하기 위해 정적 변수에 의해 정의 된 임의의 변수 이름을 생성 할 수 있습니까? 용서해주십시오. 저는 파이썬을 처음 접했습니다.

+0

x.write 전에 x를 초기화하십시오. –

+0

충분하지 않습니다. .... 나는 질문을 업데이 트했습니다 ... 어떤 예 .... ....? 마지막 오류가 발생한 이유를 이해하지만이 작업을 어떻게 수행합니까? 그냥 논리가 필요해. – jkdba

+0

size_max 이후 ... Put x = StringIO() –

답변

1

회 돌이로 x을 사용하고 있지만 처음 최대 크기에 도달하면 닫습니다. 루프가 다음 번에 돌아 가면 StringIO가 닫히고 더 이상 사용할 수 없습니다.

StringIO는 함수 외부에서가 아니라 함수 내에 만들어야합니다. 함수 본문 (루프 앞에 있음) 안에 x = StringIO()을 이동 한 다음 마지막 줄을 x = StringIO()으로 변경하여 이전 StringIO를 채울 때마다 새 StringIO를 만듭니다.

+0

정확히 내가 무엇을 찾고 있었습니까 – jkdba

관련 문제