我有两个 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/