You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:45:27