루비

2012-11-09 3 views
5

에서 문자열 (형식 오류)에 StringIO를 변환 할 수 없습니다, 나는 다음과 같은 오류 메시지가 얻을 : can't convert StringIO into String (TypeError)루비

array_of_lines = [] 
Zip::ZipInputStream::open(open("URL for zipped file", "rb")) do |io| 
    file = io.get_next_entry 
    puts "Downloading file #{file}" 
    array_of_lines = io.readlines 
    print "Downloaded ", array_of_lines.count, " elements.", "\n" 
end 

누군가가 나를 도울 수 있습니까? 미리 감사드립니다.

답변

19

읽고있는 정보가 stringIO 객체에 포함될 수있을만큼 작습니다. 일반적으로 데이터가 너무 커지면 (기본값 인 10KB 이상) 객체가 버퍼에서 꺼내어 임시 파일로 바뀌므로이를 사용자가 시도하는 방식으로 읽어야합니다.

당신은 두 가지 옵션이 있습니다
2. 기본 버퍼를 설정하려면 0

에 openURI 문자열 버퍼의 기본 설정보다 큰 파일에서
1. 읽기, 당신은 초기화를 만들어 둘 필요가 그것은이 :

OpenURI::Buffer.send :remove_const, 'StringMax' 
OpenURI::Buffer.const_set 'StringMax', 0 

현재 버퍼 설정 (10킬로바이트) 및 t를 잊지 말고 0

로 설정한다 번째 행을 삭제 첫번째 라인 o 이니셜 라이저이기 때문에 서버를 다시 시작하거나 아무 것도 변경되지 않습니다. 도움이 되었길 바래요!

+2

이 나를 구원 호출 할 필요가있다. . . 새우를 사용하여 PDF를 결합하고 프로덕션에서 "StringIO를 String으로 변환 할 수 없습니다"오류가 발생합니다. 귀하의 솔루션을 (비록 직접 관련되지 않은 경우에도) 시도하고 마법과 같은 문제를 해결했습니다. – bcb

+1

와우. 이 팁을 가져 주셔서 감사합니다. – manderson

+1

좋은 해킹, 감사합니다. +1 –

12

open("URL for zipped file", "rb")은 String이 아니라 StringIO를 반환합니다.

은 StringIO의 내용을 얻기 위해이 방법 read

string = open(url).read()