从Google Cloud Bucket加载数据时下载空文件的技术问询
问题分析与解决方案
你遇到的核心问题是使用了错误的下载URL——你当前用的http://console.cloud.google.com/storage/browser/actions是Google Cloud Storage的控制台浏览页面,不是直接指向actions.zip文件的下载链接。所以你下载到的73.7KB文件其实是这个控制台页面的HTML源码,而非实际的数据集压缩包。
原代码的关键问题点
你的代码里的URL是控制台页面,不是文件的直接访问地址:
action_dataset_folder_path = 'action-data-set' zip_path = 'actions.zip' url='http://console.cloud.google.com/storage/browser/actions' # 这里是控制台URL,不是文件下载URL class LoadProgress(tqdm): last_block = 0 def hook(self, block_num=1, block_size=1, total_size=None): self.total = total_size self.update((block_num - self.last_block) * block_size) self.last_block = block_num if not isfile(zip_path): with LoadProgress(unit='B', unit_scale=True, miniters=1, desc='actions-Dataset') as pbar: urlretrieve( url, zip_path, pbar.hook) if not isdir(action_dataset_folder_path): with tarfile.open(zip_path) as tar: tar.extractall() tar.close() print('All done ...!')
解决方法
方法1:使用公开对象的直接下载URL(如果文件是公开可读的)
如果你的actions.zip存储在名为actions的GCS Bucket中,且文件设置为公开可读,那么正确的下载URL应该是:
url = "https://storage.googleapis.com/actions/actions.zip"
替换原代码中的URL即可正常下载文件。
方法2:使用Google Cloud Storage官方Python客户端库(推荐,支持私有文件)
urlretrieve只适合简单的公开URL下载,对于GCS的文件,更可靠的方式是使用官方的google-cloud-storage库,它支持身份验证、私有文件访问,还能更好地处理下载进度:
- 先安装依赖:
pip install google-cloud-storage tqdm
- 修正后的代码:
from google.cloud import storage from tqdm import tqdm import os import tarfile action_dataset_folder_path = 'action-data-set' zip_path = 'actions.zip' bucket_name = "actions" # 你的GCS Bucket名称 blob_name = "actions.zip" # Bucket中的文件路径 # 初始化GCS客户端(本地开发需设置GOOGLE_APPLICATION_CREDENTIALS环境变量) storage_client = storage.Client() bucket = storage_client.bucket(bucket_name) blob = bucket.blob(blob_name) # 带进度条的下载 if not os.path.isfile(zip_path): file_size = blob.size with tqdm(total=file_size, unit='B', unit_scale=True, desc='actions-Dataset') as pbar: def progress_callback(bytes_downloaded): pbar.update(bytes_downloaded) blob.download_to_filename(zip_path, progress_callback=progress_callback) # 解压文件 if not os.path.isdir(action_dataset_folder_path): with tarfile.open(zip_path) as tar: tar.extractall() print('All done ...!')
补充说明
- 如果你不确定文件的直接下载URL,可以在GCS控制台中找到对应的文件,点击右上角的「更多操作」→「获取链接」,选择「公开链接」(如果文件公开)或者生成「签名URL」(私有文件,有有效期)。
- 官方客户端库还能处理权限验证、断点续传等复杂场景,比
urlretrieve更适合生产环境使用。
内容的提问来源于stack exchange,提问作者LearnToGrow
相关产品推荐
相关产品推荐

