google.cloud.storage可正常访问但gcsfs认证报错问题求助
报错原因
你遇到的invalid_scope错误是因为google.auth.default()返回的凭证默认未附加Google Cloud Storage(GCS)所需的OAuth访问权限范围(scope)。原生google.cloud.storage客户端会自动为凭证补充GCS相关的scope,而gcsfs不会自动完成这个操作,因此出现鉴权失败。
另外你的测试代码中fs.ls('data')的写法本身也不符合gcsfs的路径规则:gcsfs的路径必须以桶名作为第一层前缀,比如你的存储桶名为my-bucket,需要访问桶内的data目录,应该写为fs.ls('my-bucket/data')。
gcsfs修复方案
你可以任选以下任意一种方案修复问题:
- 方案1:手动为凭证添加GCS scope后传入
import gcsfs import google.auth # 读写权限用该scope,只读可替换为https://www.googleapis.com/auth/devstorage.read_only SCOPES = ["https://www.googleapis.com/auth/devstorage.read_write"] credentials, project_id = google.auth.default(scopes=SCOPES) fs = gcsfs.GCSFileSystem(project=project_id, token=credentials) # 路径需包含桶名 folders = fs.ls('你的桶名/data')
- 方案2:让gcsfs自动读取默认凭证,无需手动传token参数,gcsfs会自动处理scope配置
import gcsfs fs = gcsfs.GCSFileSystem(project='你的项目ID') folders = fs.ls('你的桶名/data')
- 方案3:直接传入服务账号密钥文件路径给token参数
import gcsfs fs = gcsfs.GCSFileSystem(project='你的项目ID', token='/path/to/你的密钥.json') folders = fs.ls('你的桶名/data')
无需gcsfs的原生类文件对象方案
原生google.cloud.storage本身就支持直接生成类文件对象,完全不需要切换到gcsfs,使用Blob对象的open()方法即可,返回的对象符合标准Python文件对象协议,支持read、seek、write等常用操作:
from google.cloud import storage storage_client = storage.Client() bucket = storage_client.bucket('你的桶名') blob = bucket.blob('data/audio_wav/test.wav') # 只读二进制模式打开,写模式替换为'wb'即可 with blob.open('rb') as f: # f可直接传给需要类文件对象的应用 bts = f.read()
内容的提问来源于stack exchange,提问作者user32882
相关产品推荐
相关产品推荐

