如何用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:
安装gcsfs:
pip install gcsfs读取代码:
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
相关产品推荐
相关产品推荐

