ruby - 为什么 open ("url") 有时会返回 File 有时会返回 StringIO?

标签 ruby file

我有两个 CSV 文件存储在 S3 上。当我打开其中之一时,返回一个文件。当我打开另一个时,返回一个StringIO

fn1 #=> "http://SOMEWHERE.s3.amazonaws.com/setup_data/d1/file1.csv" 
open(fn1) #=> #<File:/var/folders/sm/k7kyd0ns4k9bhfy7yqpjl2mh0000gn/T/open-uri20140814-26070-11cyjn1> 

fn2 #=> "http://SOMEWHERE.s3.amazonaws.com/setup_data/d2/d3/file2.csv" 
open(fn2) #=> #<StringIO:0x007f9718670ff0> 

为什么?有没有办法用一致的数据类型打开它们?

我需要将相同的数据类型 String 传递到 CSV.read(open(file_url)) 中,如果有时它得到一个 则它不起作用文件,有时是 StringIO

它们是通过不同的 ruby​​ 脚本创建的(它们包含非常不同的数据)。

在我的 Mac 上,它们看起来都是普通的文本 CSV 文件,它们是通过 AWS 控制台上传的,并且具有相同的权限和相同的元数据(内容类型:application/octet-stream)。

最佳答案

这是设计使然。如果对象的大小大于 10240 字节,则会创建一个临时文件。来自source :

StringMax = 10240
def <<(str)
  @io << str
  @size += str.length
  if StringIO === @io && StringMax < @size
    require 'tempfile'
    io = Tempfile.new('open-uri')
    io.binmode
    Meta.init io, @io if Meta === @io
    io << @io.string
    @io = io
  end
end

如果你需要一个 StringIO 对象,你可以使用 fastercsv .

关于ruby - 为什么 open ("url") 有时会返回 File 有时会返回 StringIO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25321595/

相关文章:

ruby - #take_while 和#select 之间的区别

ruby - 将 radix-2 数字字符串数组写入 Ruby 中的二进制文件

c - 发送和接收文件 - 套接字 - c - windows

.net - SSD 驱动器上奇怪的目录删除行为

python - 在 python 中解析大 (.5Gb) pcap 文件

c - 从文本文件读取时无限循环

ruby - 我们可以覆盖 Ruby 中的 true 和 false 方法吗?

ruby - 为什么 Ruby Net::HTTP.get_response 和 Net::HTTP.new(uri.host).request 返回不同的东西?

ruby-on-rails - 将信息从 API 转储到模型中

c++ - 从文件c++中将单个字符读入变量