Python调用gcsfs将Linux文件复制至GCS存储桶报错求助
解决方案:本地Linux文件上传至GCS(Python实现,无需gsutil)
你遇到的FileNotFound错误,主要有两个原因:一是本地路径存在拼写错误(代码中/venv/lib/python3.9./多了个冗余的点,应为/venv/lib/python3.9/);二是gcsfs.cp_file仅支持GCS存储桶内部的文件复制,不支持本地文件系统到GCS的跨系统复制。以下是两种可行的解决方法:
方法1:使用gcsfs的文件流读写
通过本地文件流读取+GCS文件流写入的方式完成上传,适配gcsfs的跨文件系统操作逻辑:
import gcsfs import os # 修正本地路径的拼写错误 os_path = os.path.join('/venv/lib/python3.9/site-packages/MY_PACKAGE/', 'a_model.py') gcs_bucket_path = os.path.join('gs://MY_BUCKET/work_folder/', 'model.py') # 先校验本地文件是否存在,提前排查路径问题 if not os.path.exists(os_path): raise FileNotFoundError(f"本地文件不存在:{os_path}") fs = gcsfs.GCSFileSystem() # 以二进制流的方式读取本地文件并写入GCS with open(os_path, 'rb') as local_file: with fs.open(gcs_bucket_path, 'wb') as gcs_file: gcs_file.write(local_file.read())
方法2:使用官方google-cloud-storage库(推荐)
GCP官方提供的客户端库,功能更全面稳定,是本地文件上传GCS的标准方案:
- 先安装依赖:
pip install google-cloud-storage
- 编写上传代码:
from google.cloud import storage import os # 修正本地路径 os_path = os.path.join('/venv/lib/python3.9/site-packages/MY_PACKAGE/', 'a_model.py') bucket_name = "MY_BUCKET" gcs_blob_path = "work_folder/model.py" # 校验本地文件存在性 if not os.path.exists(os_path): raise FileNotFoundError(f"本地文件不存在:{os_path}") # 初始化GCS客户端 client = storage.Client() bucket = client.get_bucket(bucket_name) blob = bucket.blob(gcs_blob_path) # 直接上传本地文件到指定GCS路径 blob.upload_from_filename(os_path)
注意:使用官方库时,需确保环境已配置GCP认证。可通过设置环境变量
GOOGLE_APPLICATION_CREDENTIALS指定服务账号密钥文件路径,或在GCP托管服务(如GCE、GKE)中使用默认服务账号权限。
内容的提问来源于stack exchange,提问作者user3448011
相关产品推荐
相关产品推荐

