当前位置: 首页 > news >正文

【学Python自动化】 7.1 Python 与 Rust 输入输出对比学习笔记

一、输出格式化对比

字符串格式化方法对比

格式化方式PythonRust
f-字符串f"Value: {value}"format!(“Value: {}”, value)
位置参数“{} {}”.format(a, b)format!(“{} {}”, a, b)
命名参数“{name} {age}”.format(name=“Alice”, age=30)format!(“{name} {age}”, name=“Alice”, age=30)
数字格式化f"{number:08x}"format!(“{:08x}”, number)
1 f-字符串 vs format! 宏

Python f-字符串:


name = "Alice"
age = 30
print(f"Name: {name}, Age: {age}")
# 格式化控制
import math
print(f"Pi: {math.pi:.3f}")  # Pi: 3.142

Rust format! 宏:


let name = "Alice";
let age = 30;
println!("Name: {}, Age: {}", name, age);
// 格式化控制
use std::f64::consts::PI;
println!("Pi: {:.3}", PI);  // Pi: 3.142
2 调试输出对比

Python repr() vs str():


s = "Hello\nWorld"
print(str(s))   # Hello World
print(repr(s))  # 'Hello\nWorld'value = ("answer", 42)
print(repr(value))  # ('answer', 42)

Rust Debug vs Display trait:


let s = "Hello\nWorld";
println!("{}", s);        // Hello World
println!("{:?}", s);      // "Hello\nWorld"let value = ("answer", 42);
println!("{:?}", value);  // ("answer", 42)

二、文件操作对比

文件打开模式对比
| 模式 | Python | Rust |
| 读取 | open(“file.txt”, “r”) | File::open(“file.txt”) |
| 写入 | open(“file.txt”, “w”) | File::create(“file.txt”) |
| 追加 | open(“file.txt”, “a”) | OpenOptions::new().append(true) |
| 读写 | open(“file.txt”, “r+”) | OpenOptions::new().read(true).write(true) |
| 二进制 | open(“file.bin”, “rb”) | File::open(“file.bin”) |

1 文件读写基本操作

Python (推荐使用 with):


# 读取文件
with open("file.txt", "r", encoding="utf-8") as f:content = f.read()# 或者逐行读取for line in f:print(line, end="")# 写入文件
with open("output.txt", "w", encoding="utf-8") as f:f.write("Hello World\n")f.write("Second line\n")

Rust (使用 ? 处理错误):


use std::fs::File;
use std::io::{Read, Write, BufReader, BufRead};// 读取文件
let mut file = File::open("file.txt")?;
let mut content = String::new();
file.read_to_string(&mut content)?;// 或者逐行读取
let file = File::open("file.txt")?;
let reader = BufReader::new(file);
for line in reader.lines() {println!("{}", line?);
}// 写入文件
let mut file = File::create("output.txt")?;
file.write_all(b"Hello World\n")?;
file.write_all(b"Second line\n")?;
2 文件定位和二进制操作

Python 二进制操作:


# 二进制读写
with open("file.bin", "rb+") as f:f.write(b"0123456789abcdef")f.seek(5)  # 移动到第6个字节data = f.read(1)  # b'5'f.seek(-3, 2)  # 移动到倒数第3个字节data = f.read(1)  # b'd'

Rust 二进制操作:


use std::io::{Seek, SeekFrom};let mut file = File::create("file.bin")?;
file.write_all(b"0123456789abcdef")?;
file.seek(SeekFrom::Start(5))?;  // 移动到第6个字节
let mut buffer = [0; 1];
file.read_exact(&mut buffer)?;   // [53] (ASCII '5')file.seek(SeekFrom::End(-3))?;   // 移动到倒数第3个字节
file.read_exact(&mut buffer)?;   // [100] (ASCII 'd')
3 JSON 序列化对比

JSON 基本操作

Python json 模块:


import json# 序列化
data = {"name": "Alice", "age": 30, "scores": [95, 88, 92]}
json_str = json.dumps(data, indent=2)# 写入文件
with open("data.json", "w", encoding="utf-8") as f:json.dump(data, f, indent=2)# 反序列化
with open("data.json", "r", encoding="utf-8") as f:loaded_data = json.load(f)

Rust serde_json 库:


use serde::{Deserialize, Serialize};
use std::fs::File;#[derive(Serialize, Deserialize, Debug)]
struct Person {name: String,age: u32,scores: Vec<u32>,
}// 序列化
let data = Person {name: "Alice".to_string(),age: 30,scores: vec![95, 88, 92],
};
let json_str = serde_json::to_string_pretty(&data)?;// 写入文件
let file = File::create("data.json")?;
serde_json::to_writer_pretty(file, &data)?;// 反序列化
let file = File::open("data.json")?;
let loaded_data: Person = serde_json::from_reader(file)?;

错误处理对比

Python (异常):


try:with open("file.txt", "r") as f:content = f.read()
except FileNotFoundError:print("文件不存在")
except IOError as e:print(f"IO错误: {e}")

Rust (Result 类型):


use std::io;fn read_file() -> io::Result<String> {let mut file = File::open("file.txt")?;let mut content = String::new();file.read_to_string(&mut content)?;Ok(content)
}// 使用 match 处理错误
match read_file() {Ok(content) => println!("内容: {}", content),Err(e) => match e.kind() {io::ErrorKind::NotFound => println!("文件不存在"),_ => println!("IO错误: {}", e),},
}

三、🔑 核心差异总结

特性PythonRust
错误处理异常机制Result/Option 类型
文件操作with 语句自动关闭需要显式处理或使用作用域
字符串格式化f-字符串,灵活format! 宏,类型安全
序列化json 模块内置需要 serde 外部库
编码处理encoding 参数需要显式处理 UTF-8
二进制安全需要指定 ‘b’ 模式默认就是字节操作

四、💡 实用技巧对比

路径处理

Python pathlib:


from pathlib import Pathpath = Path("data") / "file.txt"
if path.exists():content = path.read_text(encoding="utf-8")

Rust Path:


use std::path::Path;let path = Path::new("data").join("file.txt");
if path.exists() {let content = std::fs::read_to_string(path)?;
}

临时文件

Python tempfile:


import tempfilewith tempfile.NamedTemporaryFile(mode='w', delete=False) as f:f.write("临时内容")temp_name = f.name

Rust tempfile:


use tempfile::NamedTempFile;let mut temp_file = NamedTempFile::new()?;
writeln!(temp_file, "临时内容")?;
let temp_path = temp_file.path().to_path_buf();

五、🎯 学习建议

1. 从 Python 到 Rust: 准备好面对显式的错误处理和所有权问题2. 从 Rust 到 Python: 享受异常处理的简洁性,但要注意捕获具体异常3. 理解哲学差异:
  • Python: “请求宽恕比请求许可容易”

  • Rust: “编译时发现错误比运行时好”

  1. 资源管理: Python 用 with,Rust 用所有权和 Drop trait

两种语言的IO处理都很有特色,Python 更简洁,Rust 更安全!

http://www.dtcms.com/a/362646.html

相关文章:

  • Dell 服务器更新Infiniband网卡固件操作
  • 大模型适配国产化服务器昇腾(300I DUO)
  • 信创服务器总死机原因及解决办法
  • 通过 FinalShell 访问服务器并运行 GUI 程序,提示 “Cannot connect to X server“ 的解决方法
  • 【技术教程】如何将文档编辑器集成至基于Node.js的网页应用程序中
  • Babylon 编辑器快捷键小记
  • 临时邮箱地址获取服务器邮件工作流程与实现
  • Coze源码分析-工作空间-资源查询-后端源码
  • vue2滑块验证
  • 2025年IT行业女性职业发展证书选择指南
  • 从零开始在Ubuntu上快速部署Docker和Dify:结合 Dify + 蓝耘 MaaS平台打造 AI 应用实战指南
  • 网络准入控制,阻断违规外联-企业内网安全的第一道防线
  • 2025 随身 WIFI 行业报告:从拼参数到重体验,华为 / 格行 / 中兴技术差异化路径解析
  • 华为HCIE认证:三年有效期值不值得?
  • 腾讯会议的最佳替代者:Jitsi Meet 安装指南-支持onlyoffice集成
  • 第三方软件测试机构【多语言开发(PHP/Java/Python)WEB 应用的安全专业测试流程】
  • 【图像处理基石】图像预处理方面有哪些经典的算法?
  • Leetcode_206.反转链表(递归)
  • 学习日记-SpringMVC-day48-9.2
  • JS 秒转换成 MM:SS 格式
  • leetcode算法刷题的第二十四天
  • 破解数字化困局:五层双闭环治理模型详解
  • AV1 HEADERS详解
  • Linux - 进程切换 进程调渡
  • Redis 持久化机制详解
  • GD32入门到实战27--传感器任务框架搭建
  • 域内横向移动
  • AI 生成视频入门:用 Pika Labs+Runway ML 制作短内容
  • C++ numeric库简介与使用指南
  • 【LeetCode】1792. 最大平均通过率(康复-T1)