6

以下のコードを使用すると、次のエラー メッセージが表示されます。 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

誰かが私を助けることができますか?少し早いですがお礼を。

4

2 に答える 2

24

読んでいる情報は、stringIOオブジェクトに含めることができるほど小さいです。通常発生するのは、データが大きくなりすぎると(デフォルトの10KBを超える)、オブジェクトがバッファーから取り出されて一時ファイルに変換されることです。これを、意図したとおりに読み取る必要があります。

2つのオプションがあります:
1。大きなファイルから読み取る
2.openURI文字列バッファのデフォルトを0に設定します。

デフォルトのバッファを設定するには、初期化子を作成してこれを入れる必要があります。

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

1行目は現在のバッファ設定(10KB)を削除し、2行目はそれを0に設定します。

サーバーはイニシャライザーであるため、サーバーを再起動することを忘れないでください。そうしないと、何も変更されません。お役に立てば幸いです。

于 2012-12-11T07:36:44.660 に答える
12

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

StringIO のコンテンツを取得するには、メソッドを呼び出す必要がありますread

string = open(url).read()
于 2013-01-28T12:49:27.147 に答える