Effective Python系列(1.1):区别bytes和str

本篇文章是 Effective Python 这本书的第一章,本章的主要内容是什么样的代码风格才是比较符合 Python 语言。

Python 当中,bytesstr 是两种不同的数据结构。使用时,需要注意两者区别:

  1. bytes 包含的是由 8 位值所组成的序列,而 str 包含的是由 Unicode 字符组成的序列,可以指定解码格式,如 utf-8

  2. bytesstr 之间的转换,可以使用 encode()decode() 方法。

  3. bytesstr 这两种实例不能在某些操作符(例如>、==、+、%操作符)上混用

  4. 从文件读取或者写入二进制数据时,应该以 'rb'(或者'wb')这样的二进制模式打开文件

  5. 如果要从文件中读取/写入的是 Unicode 数据,则必须注意系统采用的默认编码方案。可以使用下面的代码判断:

import sys
sys.getdefaultencoding()

下面写了两个程序:

  1. 测试 bytesstr 之间的相互转换。
  2. 命令行程序:测试文件的创建、读取、写入和删除。该程序最大的亮点是提供了简易的自动补全功能。
import sys
import json
from pathlib import Path
from prompt_toolkit import prompt
from prompt_toolkit.completion import Completer, Completiondef to_str(data, encoding="utf-8"):"""将字节数据转换为字符串。参数:data: 字节数据encoding: 字符串的编码格式,默认为utf-8返回:转换后的字符串"""if isinstance(data, bytes):return data.decode(encoding)elif isinstance(data, str):return dataelse:raise TypeError(f"Expected bytes, got {type(data)}")def to_bytes(data, encoding="utf-8"):"""将字符串转换为字节数据。参数:data: 字符串数据encoding: 字节编码格式,默认为utf-8返回:转换后的字节数据"""if isinstance(data, str):return data.encode(encoding)elif isinstance(data, bytes):return dataelse:raise TypeError(f"Expected str, got {type(data)}")class JsonFileManager:def __init__(self, file_path):"""初始化文件管理器。参数:file_path: 文件路径"""self.file_path = Path(file_path).resolve()  # 转换为绝对路径def create(self):"""创建一个空的JSON文件。"""try:if not self.file_path.exists():with open(self.file_path, 'w') as f:json.dump({}, f, indent=4)print(f"文件 {self.file_path.name} 已创建。")else:print(f"文件 {self.file_path.name} 已存在。")except (IOError, PermissionError) as e:print(f"创建文件失败: {e}")def read(self):"""读取并显示JSON文件的内容。"""try:if self.file_path.exists():with open(self.file_path, 'r') as f:data = json.load(f)print("读取的文件内容:", data)else:print(f"文件 {self.file_path.name} 不存在。")except (IOError, json.JSONDecodeError) as e:print(f"读取文件失败: {e}")def delete(self):"""删除文件。"""try:if self.file_path.exists():self.file_path.unlink()print(f"文件 {self.file_path.name} 已删除。")else:print(f"文件 {self.file_path.name} 不存在。")except (IOError, PermissionError) as e:print(f"删除文件失败: {e}")def update(self, data):"""更新文件内容。"""try:with open(self.file_path, 'w') as f:json.dump(data, f, indent=4)print(f"文件 {self.file_path.name} 已更新。")except (IOError, PermissionError) as e:print(f"更新文件失败: {e}")def rename(self, new_name):"""重命名文件。"""try:new_path = self.file_path.parent / new_nameself.file_path.rename(new_path)self.file_path = new_pathprint(f"文件已重命名为 {new_name}.")except (FileNotFoundError, PermissionError) as e:print(f"重命名文件失败: {e}")def move(self, new_path):"""移动文件到新位置。"""try:new_path = Path(new_path).resolve()if not new_path.parent.exists():print(f"目标路径 {new_path.parent} 不存在.")returnself.file_path.rename(new_path)self.file_path = new_pathprint(f"文件已移动到 {new_path}.")except (FileNotFoundError, PermissionError) as e:print(f"移动文件失败: {e}")# 定义命令补全的列表
COMMANDS = ["create", "read", "delete", "update", "rename", "move", "quit"]class CommandCompleter(Completer):def __init__(self):self.commands = COMMANDS  # 定义可补全的命令列表def get_completions(self, document, complete_event):"""返回与输入的部分文本匹配的命令。"""text = document.text.strip()for command in self.commands:if command.startswith(text):yield Completion(command, start_position=-len(text))def setup_readline():"""配置自动补全功能。"""completer = CommandCompleter()# 使用prompt_toolkit的prompt函数获取输入,并启用自动补全user_input = prompt('请输入命令(create, read, delete, update, rename, move, quit): ', completer=completer)return user_input    def main():"""主函数,处理文件操作与字节数据转换。"""# setup_readline()file_path = input("请输入文件路径: ").strip()# file_path = 'dataset.json'manager = JsonFileManager(file_path)while True:command = setup_readline().strip().lower()if command == "quit":breakelif command == "update":new_data = input("请输入新的JSON数据: ")try:# 对用户输入的JSON数据进行验证new_data = json.loads(new_data)manager.update(new_data)except json.JSONDecodeError:print("输入的JSON数据格式错误")continueelif command in ["create", "read", "delete", "rename", "move"]:if command == "rename":new_name = input("请输入新的文件名: ").strip()manager.rename(new_name)elif command == "move":new_location = input("请输入新的文件路径: ").strip()manager.move(new_location)else:getattr(manager, command)()else:print("无效命令,请输入 'create', 'read', 'delete', 'update', 'rename', 'move' 或 'quit'")def main2():# 示例:创建一个包含字节数据的文件,并读取它file_path = "test_bytes.json"# 创建 JsonFileManager 实例manager = JsonFileManager(file_path)# 1. 创建文件并写入字节数据manager.create()  # 文件已创建,但内容为空 {}# 假设用户想将字符串 "Hello, World!" 转换为字节并写入文件data_to_write = to_bytes("Hello, World!")  # 使用 to_bytes 转换为字节流# 更新文件内容,将字节数据以 JSON 格式存储manager.update({"message": data_to_write.hex()})  # 将字节数据转为十六进制字符串存储# 2. 读取文件并将字节数据还原为字符串manager.read()  # 输出 { "message": "48656c6c6f2c20576f726c6421" }# 获取 JSON 数据with open(file_path, 'r') as f:data = json.load(f)# 从十六进制字符串转换回字节流message_bytes = bytes.fromhex(data["message"])# 使用 to_str 函数将字节数据转换为字符串message_str = to_str(message_bytes)print(f"读取的消息:{message_str}")  # 输出 "Hello, World!"if __name__ == "__main__":main()

程序使用例子:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/6338.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue + element-ui 组件样式缺失导致没有效果

失效 代码: 修改方法: 在main.js文件里面加上: import element-ui/lib/theme-chalk/index.css; 最后:

Formality:不可读(unread)的概念

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482https://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 在Formality中有时会遇到不可读(unread)这个概念,本文就将对此…

机器学习 vs 深度学习

目录 一、机器学习 1、实现原理 2、实施方法 二、深度学习 1、与机器学习的联系与区别 2、神经网络的历史发展 3、神经网络的基本概念 一、机器学习 1、实现原理 训练(归纳)和预测(演绎) 归纳: 从具体案例中抽象一般规律…

OpenCV:高通滤波之索贝尔、沙尔和拉普拉斯

目录 简述 什么是高通滤波? 高通滤波的概念 应用场景 索贝尔算子 算子公式 实现代码 特点 沙尔算子 算子公式 实现代码 特点 拉普拉斯算子 算子公式 实现代码 特点 高通滤波器的对比与应用场景 相关阅读 OpenCV:图像滤波、卷积与卷积核…

豆包MarsCode 蛇年编程大作战 | 高效开发“蛇年运势预测系统”

🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 豆包MarsCode 蛇年编程大作战 | 🐍 蛇年运势预测 在线体验地址:蛇年…

开源鸿蒙开发者社区记录

lava鸿蒙社区可提问 Laval社区 开源鸿蒙项目 OpenHarmony 开源鸿蒙开发者论坛 OpenHarmony 开源鸿蒙开发者论坛

关于CAN(FD)转以太网详细介绍

一、功能描述 CANFD 完全向下兼容 CAN ,以下统称 CAN(FD) 。 SG-CAN(FD)NET-210 是一款用来把 CANFD 总线数据转为网口数据的设备。 网口支持 TCP Sever 、 TCP Client 、 UDP Sever 、 UDP Client 四种模式。 可以通过软件配置和 Web 网页配置。 两路…

简洁实用的wordpress外贸模板

简洁、实用、大气的wordpress外贸模板,适合跨境电商搭建外贸B2B产品展示型网站。 简洁实用的wordpress外贸模板 - 简站WordPress主题简洁、实用、大气的wordpress外贸模板,适合跨境电商搭建外贸B2B产品展示型网站。https://www.jianzhanpress.com/?p828…

编程界“华山论剑”:PHP与Go,谁主沉浮?

在编程的广阔天地里,选择一门合适的编程语言就如同为一场冒险挑选趁手的武器,至关重要却又常常令人纠结。当我们面对 PHP 与 Go 这两种备受瞩目的编程语言时,这种纠结愈发明显:PHP,作为 Web 开发领域的老牌劲旅&#x…

QT6 + CMAKE编译OPENCV3.9

参考文档 [1] https://blog.csdn.net/rjkf_css/article/details/135676077 前提条件 配置好相关运行环境:QT6、OPENCV3.9的sources文件 OPENCV下载网页:https://opencv.org/releases/ QT6下载教程:https://blog.csdn.net/caoshangpa/article…

Python数据可视化(够用版):懂基础 + 专业的图表抛给Tableau等专业绘图工具

我先说说文章标题中的“够用版”啥意思,为什么这么写。 按照我个人观点,在使用Python进行数据分析时,我们有时候肯定要结合到图表去进行分析,去直观展现数据的规律和特定,那么我们肯定要做一些简单的可视化&#xff0…

终极的复杂,是简单

软件仿真拥有最佳的信号可见性和调试灵活性,能够高效捕获很多显而易见的常见错误,被大多数工程师熟练使用。 空间领域应用的一套数据处理系统(Data Handling System),采用抗辐FPGA作为主处理器,片上资源只包含10752个寄存器,软仿也是个挺花时间的事。 Few ms might take …

青少年CTF练习平台 贪吃蛇

题目 CtrlU快捷键查看页面源代码 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>贪吃蛇游戏</title><style>#gameCanvas {border: 1px solid black;}</style> </head>…

Linux进度条实现

Linux进度条实现 1.\r\n2.缓冲区3.缓冲区分类4.进度条实现 &#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列专栏&#xff1a;【Linux的学习】 &#x1f4dd;&#x1f4dd;本篇内容&#xff1a;\…

服务器安装ESXI7.0系统及通过离线包方式升级到ESXI8.0

新到了一台物理服务器需要安装系统&#xff0c;项目不急用&#xff0c;先拿来做些实验。 本次实验目标&#xff1a; 1、在物理服务器上安装ESXI7.0系统&#xff1b; 2、通过离线包升级方式将ESXI7.0升级为ESXI8.0。 实验环境准备&#xff1a; 物理服务器1台&#xff0c;型号…

docker日志保留策略设置

docker日志保留策略设置 默认策略 默认情况下&#xff0c;docker使用json-file日志驱动&#xff0c;并且没有设置日志保留时间。 这意味着容器日志会一直保留在宿主机上&#xff0c;直到容器被删除或手动清理。如果不对日志进行限制&#xff0c;可能会导致磁盘空间被耗尽。 …

uniapp+Vue3(<script setup lang=“ts“>)模拟12306城市左右切换动画效果

效果图&#xff1a; 代码&#xff1a; <template><view class"container"><view class"left" :class"{ sliding: isSliding }" animationend"resetSliding">{{ placeA }}</view><view class"center…

MySQL训练营-慢查询诊断问题

慢查询相关参数和建议配置 slow_query_log long_query_time 日志开关&#xff0c;是否记慢查询日志以及超过多长时间判定为慢查询。 查看参数设置&#xff1a; SHOW VARIABLES LIKE ‘slow_query_log’;SHOW VARIABLES LIKE ‘long_query_time’; 实践建议&#xff1a; …

微服务学习-Nacos 注册中心实战

1. 注册中心的设计思路 1.1. 微服务为什么会用到注册中心&#xff1f; 服务与服务之间调用需要有服务发现功能&#xff1b;例如订单服务调用库存服务&#xff0c;库存服务如果有多个&#xff0c;订单服务到底调用那个库存服务呢&#xff08;负载均衡器&#xff09;&#xff0…

Mac 查看 Java SDK 和 Android SDK 的路径

1. Mac 如何查看 JavaSDK的路径 /usr/libexec/java_home -V2. Mac 如何查看 Android SDK 的路径 在 Android Studio 中按 cmd,打开设置&#xff0c;然后如下方式&#xff0c;第三步如果有值就是第三步的信息。 第三步如果没有值&#xff0c;点开Edit&#xff0c;值在下方&…