2012-11-09 4 views
5

Quando uso il codice qui sotto, ottengo il seguente messaggio di errore: can't convert StringIO into String (TypeError)Impossibile convertire StringIO nella stringa (TypeError) in Ruby

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 

qualcuno può aiutarmi? Grazie in anticipo.

risposta

19

Le informazioni che stai leggendo sono abbastanza piccole da poter essere contenute in un oggetto stringIO. Quello che normalmente accade è che quando i dati diventano troppo grandi (oltre il valore predefinito di 10KB) l'oggetto viene estratto dal buffer e trasformato in un file temporaneo, che devi essere per leggerlo nel modo in cui stai provando.

si hanno due opzioni:
1. lettura dal file più grandi
2. Impostare il valore predefinito per il buffer di stringa openURI a 0.

Per impostare il buffer di default, è necessario creare un inizializzatore e mettere questo in esso:

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

la prima riga cancellerà l'impostazione attuale del buffer (10 KB) e la seconda linea imposterà a 0.

non dimenticare t o riavvia il tuo server poiché è un inizializzatore o non cambierà nulla. Spero che aiuti!

+2

Questo mi ha salvato. . . stavo usando Prawn per combinare i PDF e in produzione avrei ricevuto un errore "impossibile convertire StringIO in String". Ho provato la tua soluzione (anche se non direttamente correlata) e ha risolto il mio problema come per magia. – bcb

+1

Wow. Grazie per questo suggerimento, ho aiutato un sacco! – manderson

+1

Nice hack, Grazie e +1 –

12

L'espressione open("URL for zipped file", "rb") restituisce StringIO, non String.

Per ottenere il contenuto di StringIO è necessario chiamare il metodo read

string = open(url).read()