#reader #line #file-io #text-file #reading #input-file #split

pyadvreader

将文本文件分割成文本序列、字符串和(行)注释

5个稳定版本

2.2.0 2024年1月26日
2.1.1 2024年1月23日
2.1.0 2024年1月19日
2.0.0 2023年11月11日
1.2.0 2023年9月10日

Rust模式中排名1043

每月下载47

MIT许可证

135KB
4K SLoC

advreader

此库提供了一种简单高效的方式读取输入行作为字节数组。它基本上是标准库中的&[u8],但它读取每一行作为字节数组。这在您不特别关心Unicode的情况下会显著快于lines(),基本上与手动编写循环一样快。尽管代码本身有些简单,但我最近至少在4个工具中都需要这个,所以我认为现在是时候有一个方便的crate了。

安装

此工具将通过Crates.io提供,因此您可以在Cargo.toml中将它作为依赖项添加。

[dependencies]
advreader = "2.0.0"

用法

它相当简单;在您通常会在BufRead实现器上调用lines的地方,您现在可以调用byte_lines来获取一个用于遍历行的结构,作为&[u8](从而避免分配)。有两种使用API的方式,下面都展示了

// our input file we're going to walk over lines of, and our reader
let file = File::open("./my-input.txt").expect("able to open file");
let reader = BufReader::new(file);
let mut lines = reader.byte_lines();

// Option 1: Walk using a `while` loop.
//
// This is the most performant option, as it avoids an allocation by
// simply referencing bytes inside the reading structure. This means
// that there's no copying at all, until the developer chooses to.
while let Some(line) = lines.next() {
    // do something with the line
}

// Option 2: Use the `Iterator` trait.
//
// This is more idiomatic, but requires allocating each line into
// an owned `Vec` to avoid potential memory safety issues. Although
// there is an allocation here, the overhead should be negligible
// except in cases where performance is paramount.
for line in lines.into_iter() {
    // do something with the line
}

该接口是在advreader的v2.x版本系列中引入的。在v1.x版本中已经实现了Iterator特质,但为了过于符合习惯用法,需要使用unsafe合约。这个问题已经被修复,并移除了所有不安全代码,同时为那些喜欢更简洁语法的开发者提供了IntoIterator实现。

依赖关系

~3.5–8.5MB
~75K SLoC