You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用datatable的fread直接读取Google Storage文件?

直接用datatable.fread读取Google Storage上的CSV文件

问题背景

在JupyterLab + Python 3环境中,pandas可直接通过pd.read_csv("gs://bucket/folder/file.csv")读取Google Storage(GS)上的CSV文件,但使用datatable的fread时遇到多种报错:

  • 直接使用gs://路径时,fread会将其当作本地路径处理,报错文件不存在:
    DT = dt.fread("gs://bucket/folder/file.csv")
    # ValueError: File /home/local_dir/gs:/bucket/folder/file.csv does not exist
    
  • 尝试将其视为URL时,因不支持gs协议报错:
    # URLError: <urlopen error unknown url type: gs>
    
  • 使用GS的HTTPS链接时,会返回登录页面HTML而非CSV内容,导致格式错误,添加fill=True还会引发内核崩溃:
    DT = dt.fread("https://storage.cloud.google.com/bucket/folder/file.csv")
    # IOError: Too few fields on line 1: expected 3 but found only 1 (with sep='|'). Set fill=True to ignore this error.
    

不想通过dt.Frame(pd.read_csv())(无法发挥fread速度优势)或先下载文件(额外步骤)的方式,希望直接用fread读取GS上的文件。

可行解决方案

方法1:使用gcsfs创建文件对象传递给fread

datatable的fread支持读取类文件对象,借助gcsfs库可直接打开GS上的文件并传递给fread:

  1. 安装gcsfs:

    pip install gcsfs
    
  2. 读取代码:

    import datatable as dt
    import gcsfs
    
    # 创建GCS文件系统实例(默认使用当前环境的GS认证)
    fs = gcsfs.GCSFileSystem()
    
    # 打开GS上的CSV文件,作为文件对象传递给fread
    with fs.open("gs://bucket/folder/file.csv", "rb") as f:
        DT = dt.fread(f)
    

方法2:通过gsutil cat管道给fread

利用fread可从标准输入读取内容的特性,结合subprocess调用gsutil cat命令,直接将文件内容管道传递给fread:

import datatable as dt
import subprocess

# 调用gsutil cat获取文件内容,传递给fread
cmd = ["gsutil", "cat", "gs://bucket/folder/file.csv"]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
DT = dt.fread(proc.stdout)
proc.wait()

这两种方法都无需下载完整文件,能最大化利用fread的读取性能,同时直接读取GS上的文件。

内容的提问来源于stack exchange,提问作者Olivia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:10:35