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)时,对象会从缓冲区中取出并变成一个临时文件,您需要按照您尝试的方式读取它。

您有两个选择:
1. 从较大的文件中读取
2. 将 openURI 字符串缓冲区的默认值设置为 0。

要设置默认缓冲区,您需要创建一个初始化程序并将其放入其中:

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

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

不要忘记重新启动您的服务器,因为它是一个初始化程序,否则什么都不会改变。我希望这会有所帮助!

于 2012-12-11T07:36:44.660 回答
12

该表达式open("URL for zipped file", "rb")返回 StringIO,而不是 String。

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

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