Ruby

2012-11-09 19 views
5

yılında dize (TypeError) içine StringIO dönüştürülemez, aşağıdaki hata iletisi olsun: can't convert StringIO into String (TypeError)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 

Birisi bana yardımcı olabilir misiniz? Şimdiden teşekkürler.

cevap

19

Okuduğunuz bilgiler, bir stringIO nesnesinde bulunabilecek kadar küçük. Normalde, veri çok büyük olduğunda (varsayılan 10 KB'nin üzerinde), nesnenin arabellekten çıkarılıp geçici bir dosyaya dönüştürülmesidir, ki bunu çalıştığınız şekilde okumak gerekir.

İki seçeneğiniz vardır:
2. Varsayılan tampon ayarlamak için 0'a

için openURI dize tampon varsayılan atamak büyük dosyalarından
1. okuma, bir başlatıcı oluşturmak ve koymak gerekir içinde bu:

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

akım tampon ayarı (10kb) ve t unutma 0.

olarak ayarlayın edecek ikinci satırı siler ilk satırı o başlatıcı olduğu için sunucunuzu yeniden başlatın veya hiçbir şey değişmeyecektir. Umarım bu yardımcı olur!

+2

Bu beni kurtardı çağırmak gereklidir. . . PDF'leri birleştirmek için Prawn kullanıyordu ve üretimde "StringIO'nun String'e dönüştürülemez" hatasını alırdım. Çözümünüzü (doğrudan ilgili olmasa bile) denedim ve problemimi sihir gibi düzelttim. – bcb

+1

Vay. Bu bahşiş için teşekkürler, bir demet yardımcı oldu! – manderson

+1

Güzel kesmek, Teşekkür ve +1 –

12

open("URL for zipped file", "rb") ifadesi StringIO değil StringIO değerini döndürür.

StringIO içeriğini almak için bu yöntem read

string = open(url).read()