2012-11-09 6 views
5

Lorsque j'utilise le code ci-dessous, je reçois le message d'erreur suivant: can't convert StringIO into String (TypeError)Impossible de convertir StringIO en String (TypeError) en 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 

quelqu'un peut me aider? Merci d'avance.

Répondre

19

Les informations que vous lisez sont suffisamment petites pour pouvoir être contenues dans un objet stringIO. Ce qui se passe normalement, c'est que lorsque les données deviennent trop volumineuses (sur la valeur par défaut de 10 Ko), l'objet est retiré du tampon et transformé en fichier temporaire, que vous devez lire comme vous le souhaitez.

Vous avez deux options: 1.
lecture de fichiers plus volumineux
2. Réglez la valeur par défaut pour le tampon de chaîne openURI à 0.

Pour définir la mémoire tampon par défaut, vous devez créer un initialiseur et mettre ce en elle:

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

la première ligne supprimera le réglage de la mémoire tampon en cours (10KB) et la deuxième ligne sera elle à 0.

ne pas oublier t o Redémarrez votre serveur car il s'agit d'un initialiseur ou rien ne va changer. J'espère que ça aide!

+2

Cela m'a sauvé. . . utilisait Prawn pour combiner des fichiers PDF et en production, j'obtiendrais une erreur "impossible de convertir StringIO en String". J'ai essayé votre solution (même si elle n'est pas directement liée) et cela a résolu mon problème comme par magie. – bcb

+1

Wow. Merci pour cette astuce, a aidé un groupe! – manderson

+1

Nice hack, merci et +1 –

12

L'expression open("URL for zipped file", "rb") renvoie StringIO, pas String.

Pour obtenir le contenu de StringIO il est nécessaire d'appeler la méthode read

string = open(url).read() 
Questions connexes