如何用Rust结合Polars读取目录下多份CSV/Parquet/JSON文件?
在Rust中使用Polars读取目录下的多份文件(CSV/Parquet/JSON)
Polars的单文件读取API(如CsvReader::from_path)不支持glob模式,也无法直接读取目录,必须先获取目标文件列表,再逐个读取后合并。以下是针对不同文件格式的实现方案:
1. 添加必要依赖
在Cargo.toml中添加polars(按需启用对应格式特性)和glob(用于匹配文件路径):
[dependencies] polars = { version = "0.37", features = ["csv", "parquet", "json", "concat"] } glob = "0.3"
2. 读取并合并多份CSV文件
使用glob匹配所有目标CSV文件,遍历读取后合并为单个DataFrame:
use polars::prelude::*; use glob::glob; fn main() -> Result<(), Box<dyn std::error::Error>> { // 匹配目录下所有CSV文件 let csv_paths = glob("./example/*.csv")?; let mut data_frames = Vec::new(); for path in csv_paths { let path = path?; println!("读取文件: {}", path.display()); // 读取单个CSV文件 let df = CsvReader::from_path(path)? .finish()?; data_frames.push(df); } // 合并所有DataFrame(按列名对齐) let combined_df = DataFrame::concat(&data_frames, true)?; println!("{}", combined_df); Ok(()) }
3. 读取并合并多份Parquet文件
逻辑与CSV一致,使用ParquetReader处理:
use polars::prelude::*; use glob::glob; fn main() -> Result<(), Box<dyn std::error::Error>> { let parquet_paths = glob("./example/*.parquet")?; let mut data_frames = Vec::new(); for path in parquet_paths { let path = path?; let df = ParquetReader::from_path(path)? .finish()?; data_frames.push(df); } let combined_df = DataFrame::concat(&data_frames, true)?; println!("{}", combined_df); Ok(()) }
4. 读取并合并多份JSON文件
使用JsonReader处理,支持行式JSON或单对象JSON格式:
use polars::prelude::*; use glob::glob; fn main() -> Result<(), Box<dyn std::error::Error>> { let json_paths = glob("./example/*.json")?; let mut data_frames = Vec::new(); for path in json_paths { let path = path?; let df = JsonReader::from_path(path)? .finish()?; data_frames.push(df); } let combined_df = DataFrame::concat(&data_frames, true)?; println!("{}", combined_df); Ok(()) }
关键说明
DataFrame::concat的第二个参数true表示按列名对齐合并(忽略列顺序差异),设为false则严格按列索引合并。- 针对大数量文件,可采用流式处理或分批合并,避免内存占用过高。
- 若无需合并为单个DataFrame,可直接遍历文件逐个处理。
内容的提问来源于stack exchange,提问作者Finlay Weber
相关产品推荐
相关产品推荐

