无法将StringIO转换为String (TypeError)在Ruby中。

6
当我使用下面的代码时,我收到以下错误信息:无法将StringIO转换为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

有人能帮忙吗?提前感谢。

2个回答

25
您正在阅读的信息足够小,可以包含在一个stringIO对象中。通常情况下,当数据变得过大(超过默认值10KB)时,该对象将被移出缓冲区并转换为临时文件,您需要以您正在尝试的方式来读取它。
您有两个选择:
1. 从更大的文件中读取
2. 将openURI字符串缓冲区的默认值设置为0。
要设置默认缓冲区,您需要创建一个初始化程序并将其放入其中:
OpenURI::Buffer.send :remove_const, 'StringMax'
OpenURI::Buffer.const_set 'StringMax', 0

第一行代码将删除当前缓冲区设置(10KB),第二行代码将把其设置为0KB。

请不要忘记重新启动服务器,因为这是一个初始化程序,否则不会有任何更改。希望这能帮到你!


2
这个救了我......我在使用Prawn来合并PDF文件时,在生产环境中遇到了“无法将StringIO转换为String”的错误。尝试了你的解决方案(即使不是直接相关的),真的像魔术一样解决了我的问题。 - bcb
1
哇,谢谢这个提示,帮了很多忙! - manderson
1
不错的黑科技,谢谢和点赞 +1 - Ashutosh Tiwari

12

表达式open("压缩文件的URL", "rb")返回StringIO,而不是String。

要获取StringIO的内容,需要调用read方法。

string = open(url).read()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接