2012-11-09 12 views
5

に文字列(TypeError例外)に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つのオプションがあります。大きなファイル
2からの読み出し
1.デフォルトのバッファを設定するには0

にopenURI列バッファのデフォルトを設定するには、初期化子とプットを作成する必要がありますこのことで:

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

最初の行は、現在のバッファの設定(10キロバイト)を削除し、二行目は0

に設定されますトンを忘れてはいけませんoイニシャライザであるためサーバーを再起動するか、何も変更されません。私はそれが助けて欲しい!

+2

これは私を救っ呼び出す必要があります。 。 。私はPDFを結合するためにPrawnを使用していましたが、私は "StringIOをStringに変換できません"というエラーが発生します。あなたの解決策を試してみました(たとえ直接関係していなくても)、私の問題は魔法のように修正されました。 – bcb

+1

うわー。このヒントをありがとう、束を助けた! – manderson

+1

素敵なハック、感謝と+1 –

12

open("URL for zipped file", "rb")は、StringではなくStringIOを返します。

はたStringIOの内容を取得するためには、法read

string = open(url).read()