"http://SOMEWHERE.s3.amazonaws.c-6ren">
gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:53:57 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com