GSutil URI 间歇性失效求助:部分云存储文件无法访问
问题原因与解决方案
核心原因
- pandas的
read_csv等IO方法内置支持云存储协议(包括GS),这是因为pandas依赖了fsspec/gcsfs这类云存储适配库,Vertex AI环境默认预装了这些依赖,因此可以直接解析gs://路径。 - Python内置的
open()函数、以及默认配置下的numpy.load()不支持云存储URI,它们只能识别本地文件系统路径,会把gs://当成本地目录结构,自然触发FileNotFoundError。
可行解决方案
方案1:用gcsfs库直接操作云存储文件
gcsfs是专门适配Google Cloud Storage的文件系统库,可直接替代本地文件操作:
- 确保环境已安装gcsfs(Vertex环境通常已预装,若没有则执行
pip install gcsfs) - 替换
open()操作:
from gcsfs import GCSFileSystem fs = GCSFileSystem() with fs.open('gs://poker030120203/rank_table.bin', 'r') as f: rank_table_content = f.read()
- 替换
numpy.load()操作:
from gcsfs import GCSFileSystem import numpy as np fs = GCSFileSystem() with fs.open('gs://poker030120203/preflop_table.npy', 'rb') as f: self.preflop_table = np.load(f)
方案2:下载文件到本地临时目录再操作
如果不想引入额外库依赖,可先将云存储文件下载到本地临时路径,再用原生方法读取:
from google.cloud import storage import tempfile import numpy as np import os # 初始化存储客户端 storage_client = storage.Client() bucket = storage_client.bucket('poker030120203') # 处理npy文件 blob = bucket.blob('preflop_table.npy') with tempfile.NamedTemporaryFile(delete=False) as tmp_file: blob.download_to_file(tmp_file) tmp_path = tmp_file.name self.preflop_table = np.load(tmp_path) # 用完删除临时文件 os.unlink(tmp_path)
方案3:配置numpy启用远程存储支持(numpy 1.21+)
numpy从1.21版本开始支持通过fsspec访问远程存储,只需确保fsspec和gcsfs已安装,即可直接使用gs://路径:
import numpy as np # 确保fsspec、gcsfs已安装 self.preflop_table = np.load('gs://poker030120203/preflop_table.npy', allow_pickle=False)
注:allow_pickle参数根据文件是否包含pickle对象调整,若文件是普通numpy数组可设为False。
额外验证点
- 检查文件路径拼写:GCS路径大小写敏感,确认文件名(如
rank_table.bin、preflop_table.npy)拼写完全正确,无大小写错误或笔误。 - 确认权限:虽然pandas能读取文件说明权限基本没问题,但可验证Vertex服务账号是否拥有该存储桶的
storage.objects.get权限。
内容的提问来源于stack exchange,提问作者Raphaël Ambit
相关产品推荐
相关产品推荐

