最近由于要优化一些Python的脚本,开始接触Rust这块的资料。官网提供了一个比较好文档,只是目前中文化的资料还比较少。基于搜索编程似乎麻烦一点。先根据实际情况在官网文档看了一些说明。先把接触的问题记录下来,以留为后面使用。
python读取xyz文件比较容易,所需要的代码并不多。转换Rust似乎也遇到一些Api上和语法的困扰。下面看看如何读取xyz文件。xyz的文件如下,描述一个分子的三维坐标。下面通过Rust方式将其提取出来。
10
C -7.882 1.429 -4.724
C -7.788 0.036 -5.039
H -7.016 -0.607 -4.626
C -8.811 -0.592 -5.798
H -8.733 -1.641 -6.068
C -9.882 0.194 -6.282
C -9.86 1.556 -6.042
H -10.671 2.123 -6.491
C -8.973 2.203 -5.244
H -9.079 3.268 -5.059
看一下Rust的这块编程如下写。在书写过程,其实花费很长时间找资料,光写起来,主要不熟悉,编译过程也遇到一些小问题。其次语法体验也是要消化比较慢。
下面关于采取读取文件和操作字符串两个做法。
裁剪字符串使用两个方法 一个是 split 另外一个是split_whitespace,前者可以根据标记来分拆,这种方式也很常见。后者采取去除了空格去分割,后者刚好适合我们提取xyz的原子坐标信息,同时也可以判断是否原子信息还是数量。
在实验过程,遇到一个类型判断问题,这个查询资料没有具体去解决如何去解决将一个数字字符串判断为整形类型。采取了split_whitespace方法去处理短期避开了Rust类型判断的事情,满足了提取xyz坐标的问题。因此,暂时采取了这样方法去提取坐标。
use std::fs;
use std::time::{Instant};
fn main() {
readxyz();
}
fn readxyz(){
let start = Instant::now();
let s = fs::read_to_string("0001_ligand_raw_ring_1.xyz").unwrap();
//将原子的和坐标控制抽离出来
let result: Vec<&str> = s.split("\n").collect();
let mut atomlist: Vec<Vec<&str>> = Vec::new();
for line in result.iter(){
if line == &"" || line == &"\r"{
println!("内容{:?}",line);
continue;
}
let cur_line: Vec<&str> = line.split_whitespace().collect();
if cur_line.len() > 1 {
atomlist.push(cur_line);
}
}
let duration = start.elapsed();
println!("循环的耗时: {:?}", duration);
println!("内容{:?}",atomlist);
}
cargo run 输出内容
Rust提取这样一个小小文件,时间上也很快,在做这个实验的过程,书写过程会对本人产生很多语法上干扰,所以写起来并不是很流畅去解决这个解析文件过程。大数量批量的情况,如果将mol2文件批量转换xyz文件会相对也会得到时间上的一定提升。不过呢,实际上python openbabel足够满足使用了,不差那么一点时间的话。只是在Rust使用这块上,还是可以继续挖掘一些实用的信息。我想在今后这块会找到很多实用的点。虽然门槛高,也意味对使用者的要求也有一定提升空间。
但是在选型这块,c,c++ ,python 结合资料比较多。Rust在资料搜索上还需要积累一些平民化的案例和资料。