#amazon-s3 #data-file #file-io #s3 #io #file-reader #reading-file

bin+lib oneio

OneIO 是一个 Rust 库,提供从不同来源和压缩格式中读取和写入数据文件的统一简单 IO 接口。

45 个版本 (16 个重大更改)

0.17.0 2024 年 8 月 4 日
0.17.0-beta.22024 年 7 月 23 日
0.17.0-beta.12024 年 6 月 4 日
0.16.7 2024 年 3 月 26 日
0.5.0 2022 年 11 月 8 日

压缩 中排名 #22

Download history 188/week @ 2024-05-03 141/week @ 2024-05-10 234/week @ 2024-05-17 134/week @ 2024-05-24 285/week @ 2024-05-31 178/week @ 2024-06-07 204/week @ 2024-06-14 174/week @ 2024-06-21 136/week @ 2024-06-28 151/week @ 2024-07-05 319/week @ 2024-07-12 309/week @ 2024-07-19 230/week @ 2024-07-26 330/week @ 2024-08-02 252/week @ 2024-08-09 213/week @ 2024-08-16

每月下载量 1,067
9 crates 中使用

MIT 许可协议

73KB
806

OneIO - Rust 的一站式便捷 IO 库

Rust Crates.io Docs.rs License

OneIO 是一个 Rust 库,提供从不同来源和压缩格式中读取和写入数据文件的统一简单 IO 接口。

使用方法和功能标志

启用所有压缩算法并处理远程文件(默认)

oneio = "0.17"

从支持的功能标志中选择

oneio = { version = "0.17", default-features = false, features = ["remote", "gz"] }

默认标志包括 lib-corerustls

核心功能: lib-core

lib-core 核心功能包括

  • remote: 允许从远程文件读取,包括 http(s) 和 ftp
  • compressions: 支持所有压缩算法
    • gz: 使用 flate2 crate 支持 gzip 文件
    • bz: 使用 bzip2 crate 支持 bzip2 文件
    • lz: 使用 lz4 crate 支持 lz4 文件
    • xz: 使用 xz2 crate 支持 xz 文件(需要安装 xz 库)
    • zstd: 使用 zstd crate 支持 zst 文件
  • json: 使用 serdeserde_json 允许将 JSON 内容读取到结构体中

TLS 选择: rustlsnative-tls

用户可以选择 rustlsnative-tls 作为他们的 TLS 库。我们使用 rustls 作为基本库。

用户还可以通过设置环境变量 ONEIO_ACCEPT_INVALID_CERTS=true 来选择接受无效证书(不推荐)。

可选功能: cli, s3, digest

  • s3: 允许从 AWS S3 兼容的存储桶中读取
  • cli:构建命令行程序 oneio,使用以下功能
    • lib-corerustlss3 用于核心功能
    • claptracing 用于 CLI 基础
  • digest 用于生成 SHA256 摘要字符串

选择一些压缩算法

用户还可以手动选择特定的压缩算法。例如,仅使用本地的 gzipbzip2 文件

oneio = { version = "0.17", default-features = false, features = ["gz", "bz"] }

使用 oneio 命令行工具

OneIO 包含一个命令行工具 oneio,该工具可以将本地/远程文件打开并读取到终端,并自动处理解压缩。如果您想从本地或远程源读取一些压缩的纯文本文件,这可能很有用。

oneio reads files from local or remote locations with any compression

Usage: oneio [OPTIONS] [FILE] [COMMAND]

Commands:
  s3      S3-related subcommands
  digest  Generate SHA256 digest
  help    Print this message or the help of the given subcommand(s)

Arguments:
  [FILE]  file to open, remote or local

Options:
  -d, --download                 download the file to current directory, similar to run `wget`
  -o, --outfile <OUTFILE>        output file path
      --cache-dir <CACHE_DIR>    cache reading to specified directory
      --cache-force              force re-caching if local cache already exists
      --cache-file <CACHE_FILE>  specify cache file name
  -s, --stats                    read through the file and only print out stats
  -h, --help                     Print help
  -V, --version                  Print version

您可以在 oneio 后指定数据文件位置。以下命令打印出来自 https://bgpkit.com 的原始 HTML 文件。

oneio https://bgpkit.com

这是使用 oneio 读取远程压缩 JSON 文件、将其传递到 jq 并计算数组中 JSON 对象数量的另一个示例。

$ oneio https://data.bgpkit.com/peer-stats/as2rel-latest.json.bz2 | jq '.|length'
802861

您还可以使用 --download(或 -d)标志直接下载文件。

$ oneio -d https://archive.routeviews.org/route-views.amsix/bgpdata/2022.11/RIBS/rib.20221107.0400.bz2
file successfully downloaded to rib.20221107.0400.bz2

$ ls -lh rib.20221107.0400.bz2
-rw-r--r--  1 mingwei  staff   122M Nov  7 16:17 rib.20221107.0400.bz2

$ monocle parse rib.20221107.0400.bz2 |head -n5
A|1667793600|185.1.167.24|3214|0.0.0.0/0|3214 1299|IGP|185.1.167.24|0|0|3214:3001|NAG||
A|1667793600|80.249.211.155|61955|0.0.0.0/0|61955 50629|IGP|80.249.211.155|0|0||NAG||
A|1667793600|80.249.213.223|267613|0.0.0.0/0|267613 1299|IGP|80.249.213.223|0|0|5469:6000|NAG||
A|1667793600|185.1.167.62|212483|1.0.0.0/24|212483 13335|IGP|152.89.170.244|0|0|13335:10028 13335:19000 13335:20050 13335:20500 13335:20530 lg:212483:1:104|NAG|13335|108.162.243.9
A|1667793600|80.249.210.28|39120|1.0.0.0/24|39120 13335|IGP|80.249.210.28|0|0|13335:10020 13335:19020 13335:20050 13335:20500 13335:20530|AG|13335|141.101.65.254

将 OneIO 读取器作为库使用

返回的读取器实现了 BufRead,并处理以下类型的解压缩

  • gzip:以 gzgzip 结尾的文件
  • bzip2:以 bzbz2 结尾的文件
  • lz4:以 lz4lz 结尾的文件
  • xz:以 xzxz2 结尾的文件
  • zstd:以 zstzstd 结尾的文件

它还可以透明地读取远程或本地文件。

示例

全部读取到字符串中

const TEST_TEXT: &str = "OneIO test file.
This is a test.";

let mut reader = oneio::get_reader("https://spaces.bgpkit.org/oneio/test_data.txt.gz").unwrap();
let mut text = "".to_string();
reader.read_to_string(&mut text).unwrap();
assert_eq!(text.as_str(), TEST_TEXT);

按行读取

use std::io::BufRead;

const TEST_TEXT: &str = "OneIO test file.
This is a test.";

let lines = oneio::read_lines("https://spaces.bgpkit.org/oneio/test_data.txt.gz").unwrap()
.map(|line| line.unwrap()).collect::<Vec<String>>();
assert_eq!(lines.len(), 2);
assert_eq!(lines[0].as_str(), "OneIO test file.");
assert_eq!(lines[1].as_str(), "This is a test.");

将 OneIO 写入器作为库使用

[get_writer] 返回一个泛型写入器,实现了 [Write],并处理以下类型的解压缩

  • gzip:以 gzgzip 结尾的文件
  • bzip2:以 bzbz2 结尾的文件

注意:目前不支持 lz4 写入器。

示例

常见 IO 操作
let to_read_file = "https://spaces.bgpkit.org/oneio/test_data.txt.gz";
let to_write_file = "/tmp/test_write.txt.bz2";

// read text from remote gzip file
let mut text = "".to_string();
oneio::get_reader(to_read_file).unwrap().read_to_string(&mut text).unwrap();

// write the same text to a local bz2 file
let mut writer = oneio::get_writer(to_write_file).unwrap();
writer.write_all(text.as_ref()).unwrap();
drop(writer);

// read from the newly generated bz2 file
let mut new_text = "".to_string();
oneio::get_reader(to_write_file).unwrap().read_to_string(&mut new_text).unwrap();

// compare the decompressed content of the remote and local files
assert_eq!(text.as_str(), new_text.as_str());
std::fs::remove_file(to_write_file).unwrap();
使用自定义头读取远程内容
use std::collections::HashMap;
use reqwest::header::HeaderMap;

let headers: HeaderMap = (&HashMap::from([("X-Custom-Auth-Key".to_string(), "TOKEN".to_string())]))
    .try_into().expect("invalid headers");

let client = reqwest::blocking::Client::builder()
    .default_headers(headers)
    .danger_accept_invalid_certs(true)
    .build().unwrap();
let mut reader = oneio::get_http_reader(
    "https://SOME_REMOTE_RESOURCE_PROTECTED_BY_ACCESS_TOKEN",
    Some(client),
).unwrap();
let mut text = "".to_string();
reader.read_to_string(&mut text).unwrap();
println!("{}", text);
将远程文件下载到本地目录
oneio::download(
    "https://data.ris.ripe.net/rrc18/2022.11/updates.20221107.2325.gz",
    "updates.gz",
    None
).unwrap();
use oneio::s3::*;

// upload to S3
s3_upload("oneio-test", "test/README.md", "README.md").unwrap();

// read directly from S3
let mut content = String::new();
s3_reader("oneio-test", "test/README.md")
    .unwrap()
    .read_to_string(&mut content)
    .unwrap();
println!("{}", content);

// download from S3
s3_download("oneio-test", "test/README.md", "test/README-2.md").unwrap();

// get S3 file stats
let res = s3_stats("oneio-test", "test/README.md").unwrap();
dbg!(res);

// error if file does not exist
let res = s3_stats("oneio-test", "test/README___NON_EXISTS.md");
assert!(res.is_err());

// copy S3 file to a different location
let res = s3_copy("oneio-test", "test/README.md", "test/README-temporary.md");
assert!(res.is_ok());
assert_eq!(
    true,
    s3_exists("oneio-test", "test/README-temporary.md").unwrap()
);

// delete temporary copied S3 file
let res = s3_delete("oneio-test", "test/README-temporary.md");
assert!(res.is_ok());
assert_eq!(
    false,
    s3_exists("oneio-test", "test/README-temporary.md").unwrap()
);

// list S3 files
let res = s3_list("oneio-test", "test/", Some("/".to_string()), false).unwrap();

assert_eq!(
    false,
    s3_exists("oneio-test", "test/README___NON_EXISTS.md").unwrap()
);
assert_eq!(true, s3_exists("oneio-test", "test/README.md").unwrap());

由 BGPKIT 团队用 ❤️ 构建

https://bgpkit.com/favicon.ico

许可证

MIT

依赖

~0.3–18MB
~290K SLoC