如何在Jupyter Notebook中读取GCS的txt文件并合并转为CSV
问题根因
list_blobs()接口仅返回GCS存储桶内的对象元数据引用,即你看到的<Blob: sleep-accel, xxx, xxx>格式输出,不会自动拉取文件的实际内容,需要调用Blob实例自带的下载方法才能获取txt文件内的真实数据,后续按数据结构解析合并即可输出目标CSV。
实现逻辑
- 遍历prefix匹配的Blob列表时,过滤掉空目录占位项、非txt格式的无效对象
- 对每个有效txt文件,调用下载接口拉取文本内容,按sleep-accel数据集motion文件的空格分隔格式解析结构化数据
- 可选补充受试者ID字段(从文件名提取),方便后续数据分析时溯源
- 批量合并所有结构化数据,输出为标准CSV格式,支持直接存到Notebook本地或回写至GCS
可直接运行的代码
from google.cloud import storage import pandas as pd from io import StringIO # 初始化GCS客户端 client = storage.Client() BUCKET_NAME = 'sleep-accel' MOTION_FILE_PREFIX = 'physionet.org/files/sleep-accel/1.0.0/motion/' bucket = client.get_bucket(BUCKET_NAME) all_records = [] for blob in bucket.list_blobs(prefix=MOTION_FILE_PREFIX): # 跳过空目录、非txt文件 if blob.name.endswith('/') or not blob.name.endswith('.txt'): continue # 从文件名提取受试者ID,例:1455390_acceleration.txt 提取ID为1455390 subject_id = blob.name.split('/')[-1].split('_')[0] # 下载txt文本内容,该数据集motion文件为UTF-8编码、空格分隔、无表头 file_content = blob.download_as_text(encoding='utf-8') # 解析为结构化表,列对应:时间戳、X轴加速度、Y轴加速度、Z轴加速度 single_df = pd.read_csv( StringIO(file_content), sep='\s+', header=None, names=['timestamp', 'acc_x', 'acc_y', 'acc_z'] ) single_df['subject_id'] = subject_id all_records.append(single_df) # 合并所有文件数据 merged_df = pd.concat(all_records, ignore_index=True) # 结果验证:打印前5行 print(merged_df.head()) # 保存为CSV到Notebook本地路径 merged_df.to_csv('merged_sleep_accel_motion.csv', index=False, encoding='utf-8') # 若需要把合并后的CSV回写到GCS,取消注释以下代码即可 # target_blob = bucket.blob('merged_result/merged_sleep_accel_motion.csv') # target_blob.upload_from_string( # merged_df.to_csv(index=False, encoding='utf-8'), # content_type='text/csv' # )
注意事项
- 提前确认Notebook绑定的GCP服务账号拥有目标存储桶的
storage.objects.get、(如需回写则加storage.objects.create)权限,否则会触发权限报错 - 如果motion目录下文件总大小超过Notebook实例的可用内存,不要一次性把所有文件加载到内存,可改为逐文件解析、逐行写入CSV的流式处理逻辑,避免内存溢出
- 该数据集motion目录下的txt无表头、用不定长空格分隔字段,代码已适配该格式;如果后续需要合并睡眠标签、心率等其他目录的文件,对应调整分隔符、列名配置即可
内容的提问来源于stack exchange,提问作者dev
相关产品推荐
相关产品推荐

