我如何读取多个CSV/Parquet/JSON等文件从一个目录使用Rust?



我正在使用Rust的极地,我希望能够读取多个csv文件作为输入。

我在文档中找到了这一节,它展示了如何使用Python使用glob模式读取多个文件,但我找不到在Rust中这样做的方法。

在Rust中尝试glob模式不工作。

我尝试的代码是

use polars::prelude::*;
fn main() {
let df = CsvReader::from_path("./example/*.csv").unwrap().finish().unwrap();
println!("{:?}", df);
}

错误

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Io(Os { code: 2, kind: NotFound, message: "No such file or directory" })', src/main.rs:26:54
stack backtrace:
0: rust_begin_unwind

我也尝试独立创建路径,并确认路径代表一个目录,

use std::path::PathBuf;
use polars::prelude::*;
fn main() {
let path = PathBuf::from("./example");
println!("{}", path.is_dir());
let df = CsvReader::from_path(path).unwrap().finish().unwrap();
println!("{:?}", df);
}

也会失败,并出现相同的错误。

所以问题是我如何读取多个CSV/Parquet/JSON等文件从一个目录使用Rust?

您的问题中引用的文档部分使用了glob库和python中的for循环。

因此,我们可以编写rust版本实现类似的想法如下:

<<h2>渴望版本/h2>
use std::path::PathBuf;
use glob::glob;
use polars::prelude::*;
fn main() {
let csv_files = glob("my-file-path/*csv")
.expect("No CSV files in target directory");
let mut dfs: Vec<PolarsResult<DataFrame>> = Vec::new();
for entry in csv_files {
dfs.push(read_csv(entry.unwrap().to_path_buf()));
}
println!("dfs: {:?}", dfs);

}

fn read_csv(filepath: PathBuf) -> PolarsResult<DataFrame> {
CsvReader::from_path(filepath)?
.has_header(true)
.finish()
}

懒惰的版本
fn read_csv_lazy(filepath: PathBuf) -> PolarsResult<LazyFrame> {
LazyCsvReader::new(filepath).has_header(true).finish()
}
fn main() {

let mut ldfs: Vec<PolarsResult<LazyFrame>> = Vec::new();
for entry in csv_files {
ldfs.push(read_csv_lazy(entry.unwrap().to_path_buf()));
}
// do stuff
for f in ldfs.into_iter() {
println!("{:?}", f.unwrap().collect())
}
}

最新更新