如何用glob模式结合pydrive2 fsspec批量读取CSV到Polars DataFrame
问题:如何结合fsspec与Polars通过glob模式批量读取Google Drive上的CSV文件?
本地存储schema一致的CSV文件时,可直接通过pl.read_csv('data/file_*.csv')合并为单个Polars DataFrame。但将文件存储在Google Drive(非GCS存储桶),使用pydrive2.fs的GDriveFileSystem作为fsspec文件系统时,无法直接用glob模式批量读取,只能逐个读取后拼接(示例代码如下),这种方式需要提前知晓文件数量和路径,代码不够简洁:
fs = GDriveFileSystem(ROOT_FOLDER_ID, client_id = CLIENT_ID, client_secret = CLIENT_SECRET) dfs = [] for i in range(1, 3): with fs.open(f'{ROOT_FOLDER_ID}/data/file_{i}.csv', 'rb') as f: dfs.append(pl.read_csv(f)) df = pl.concat(dfs)
请问是否有办法结合fsspec文件系统,使用glob模式批量读取这些文件?
解决方案
方法1:利用fsspec的glob方法获取文件列表后批量读取
先通过GDriveFileSystem的glob方法匹配目标文件路径,再批量读取并合并,无需提前知道文件数量:
from pydrive2.fs import GDriveFileSystem import polars as pl # 初始化Google Drive文件系统 fs = GDriveFileSystem(ROOT_FOLDER_ID, client_id=CLIENT_ID, client_secret=CLIENT_SECRET) # 用glob匹配所有目标CSV文件 target_files = fs.glob(f"{ROOT_FOLDER_ID}/data/file_*.csv") # 批量读取文件并合并为单个DataFrame df = pl.concat([pl.read_csv(fs.open(file_path, 'rb')) for file_path in target_files])
方法2:注册文件系统后直接用Polars的glob读取
将GDriveFileSystem注册到fsspec后,可直接在pl.read_csv中使用glob模式,借助Polars原生的批量读取能力:
from pydrive2.fs import GDriveFileSystem import polars as pl import fsspec # 注册GDrive文件系统到fsspec fsspec.register_implementation('gdrive', GDriveFileSystem) # 初始化文件系统实例 fs = GDriveFileSystem(ROOT_FOLDER_ID, client_id=CLIENT_ID, client_secret=CLIENT_SECRET) # 直接用glob模式读取并合并文件 df = pl.read_csv( f"gdrive://{ROOT_FOLDER_ID}/data/file_*.csv", storage_options={"fs": fs} )
这两种方法都无需硬编码文件数量或具体文件名,代码更简洁灵活,且能自动匹配所有符合glob规则的文件。
内容的提问来源于stack exchange,提问作者Elis Evans
相关产品推荐
相关产品推荐

