mfc从文件中读取数据_Python 中的 bytes、str 以及 unicode 区别

d63c4e721849b8af70a21b7cfcf3bb8b.png

从Python发展历史谈起

Python3和Python2表示字符序列的方式有所不同。

  • Python3字符序列的两种表示为byte和str。前者的实例包含原始的8位值,即原始的字节;后者的实例包括Unicode字符。
  • Python2字符序列的两种表示为str和unicode。与Python3不同的是,str实例包含原始的8位值;而unicode的实例,则包含Unicode字符。

类型转换

把Unicode字符表示为二进制数据有许多方法。做常见的编码方式是UTF-8。但是python3的str实例和Python2的unicode实例都没有和特定的二进制编码形式相关联。要想把Unicode字符转换为二进制数据,就必须使用encode方法。要想把二进制数据转换成Unicode字符,则必须使用decode方法。

因此,在编写大型复杂的Python程序的时候,一般把编码和解码的相关操作放到最外层来做。程序核心部分使用Unicode字符类型,也就是Python3的str以及Python2的unicode,而且不要对字符编码做任何假设。这种办法既可以让程序接受多种类型的文本编码,又可以保证输出的文本信息只采用一种编码形式(最好是UTF-8),灵活性很高。

所以,可以编写两个辅助函数,以便对序列进行转换,使得转换后的输入数据符合开发者预期。

对于Python3

在Python3中,我们需要编写一个接收str或bytes,并总是返回str的方法:

def to_str(bytes_or_str):if isinstance(bytes_or_str, bytes):return bytes_or_str.decode('utf-8')return bytes_or_str # instance of str 

以及一个总是返回bytes的方法:

def to_bytes(bytes_or_str):if isinstance(bytes_or_str, str):return bytes_or_str.encode('utf-8')return bytes_or_str # instance of bytes

对于Python2

在Python2中,我们需要编写一个接收str或unicode,并总是返回unicode的方法:

def to_unicode(unicode_or_str):if isinstance(unicode_or_str, str):return unicode_or_str.decode('utf-8')return unicode_or_str # instance of unicode

以及一个总是返回str的方法:

def to_str(unicode_or_str):if isinstance(unicode_or_str, unicode):return unicode_or_str.encode('utf-8')return unicode_or_str # instance of str

面临的问题

在Python中使用原始8位值与Unicode字符时,通常有两个问题需要注意。

第一个问题

第一个问题通常出现在Python2中,如果你用的是Python3,可以暂且忽略这个问题。

如果str只包含7位的ASCII字符,那么unicode和str实例似乎就成了同一种类型。

  • 可以用+操作符把str与unicode连接起来
  • 可以进行比较操作比如, ==!=、<、>

这些行为一位着,只处理7位的ASCII的情况下,如果某个函数接受str,那么可以给它传入unicode;如果某个函数接收unicode,也可以传入str。而在Python3中,bytes和str实例绝对不会等价,更不能进行比较,即使是空字符串也不可以,因为这是完全不同的两个类型。所以,在传入字符序列的时候必须留意其类型。

第二个问题

第二个问题可能会出现在Python3上,也是经常遇到的一些问题。

如果通过内置的open函数获取讴歌文件句柄,那么需要注意的是,该句柄默认会采用UTF-8编码格式来操作文件。而在Python2中,文件操作的默认格式是二进制的,这可能会导致程序出现奇怪的错误。

例如,现在要向文件中随机写入二进制数据,下面这个写法在Python2中不会有什么问题,但在Python3中会有异常,提示TypeError: write() argument must be str, not bytes

with open('./random.bin', 'w') as f:f.write(os.urandom(10))>>> TypeError: write() argument must be str, not bytes

发生上述问题的原因是Python3给open函数添加了encode参数,而这个新参数的默认值是UTF-8。这样一来,系统就会要求开发者必须传入包含Unicode字符的str实例,而不是包含二进制数据的bytes实例。

为了解决这个问题,我们必须用二进制写入模式,即将原来的'w'修改为'wb',这样一来就可以同时适配Python2和Python3。从文件中读取数据的时候也会有类似的问题,解决方法与写入类似,使用'rb'模式打开文件,而不是'r'模式。

总结

  1. 在Python3中,bytes是一种包含8位值的序列,str是一种包含Unicode字符的序列。开发者不用比较操作来混合处理。
  2. 在Python2中,str是一种包含8位值的序列,unicode是一种包含Unicode字符的序列。如果str只有7位ASCII字符,那么可以进行比较运算以及连接操作。
  3. 在对输入的数据操作之前,使用辅助函数来保证字符序列的类型与开发者的期望一致。
  4. 从文件中读取二进制数据,或向其中写入二进制数据时,总应该以'rb'或'wb'等二进制模式来开启文件。

参考阅读:

《Effective Python》

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

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

相关文章

linux字符雨,linux周记

shell脚本基础格式要求&#xff1a;首行shebaang机制#!/bin/bash#!/usr/bin/python#!/usr/bin/perlshell脚本用途&#xff1a;自动化常用命令执行系统管理和故障排除创建简单的应用程序处理文本或文件bash中变量的种类局部变量&#xff1a;生效范围为当前shell进程&#xff1b;…

【音视频安卓开发 (一)】AndroidStudio项目配置权限、jni库路径、ABI、Cmake

cmake项目配置 # For more information about using CMake with Android Studio, read the # documentation: https://d.android.com/studio/projects/add-native-code.html# Sets the minimum version of CMake required to build the native library.cmake_minimum_require…

string index out of range_Java 12 骚操作, String居然还能这样玩!

坐稳了&#xff0c;准备起飞&#xff01;1、transformtransform&#xff1a;即字符串转换&#xff0c;来看下 transform 的实现源码&#xff1a;public <R> R transform(Function<? super String, ? extends R> f) {return f.apply(this); }传入一个函数式接口 F…

弹性架构_实践中的弹性基础架构

弹性架构几周前&#xff0c;我获得了一个难得的机会&#xff0c;可以在基础设施领域中沾沾自喜。 在JVM内部的深入了解下&#xff0c;我每天的工作经历发生了有趣的变化&#xff0c;我想与您分享动机和成果。 希望它可以启发类似的问题类别。 背景 我将从解释需要解决方案的上…

linux的ctrl alt f6的作用,Linux(Centous6.4)操作系统中,快捷键Alt+Ctrl+F10是什么作用?...

满意答案John_05152017.07.16一些常用快捷键切换到第一个文本终端。在Linux 下你可以有多达六个不同的终端。这个命令的意思是&#xff1a;“同时按住键和键&#xff0c;然后按键&#xff0c;再释放所有的键”。(n1..6)&#xff1a;切换到第n个文本终端。(你也可以使用不是很经…

【TCP丢包重传】

TCP丢包重传机制如果在网络状况最糟糕的情况下就会造成极大的延迟。或者超过2min断开连接。如果这种场景下可以采用UDP。UDP需要解决包的重新排序&#xff0c;丢包等问题。

前端H5怎么切换语言_「自学系列一」HTML5大前端学习路线+视频教程完整版

全新Java、HTML5前端、大数据、Python爬虫、全链UI设计、软件测试、Unity 3D、Go语言等多个技术方向的全套视频。面对这么多的知识点&#xff0c;有的盆友就麻爪了……我是谁&#xff1f;我该从哪里开始看&#xff1f;我该怎么看&#xff1f;我该看多少&#xff1f;这&#xff…

r语言在linux下取数据,菜鸟第一步,跪在数据处:R语言读取数据

1. 温故知坑实践是学习知识的最好途径。之前我讲的内容都非常非常基础&#xff0c;包括&#xff1a;(1)什么是R语言&#xff1f;R语言和Rstudio软件的安装&#xff0c;Rstudio的界面介绍&#xff1b;(2)R语言的基本逻辑&#xff0c;基本数据类型&#xff1b;(3)ggplot基础绘图&…

c语言 桌面程序_C语言编程工具:Dev - C++ 简单安装和使用!新手福利!

工欲善其事&#xff0c;必先利其器。——《论语》# 写在前面有关编译器和开发工具可以查看历史文章。# 下载Dev-C操作系统建议Windows 7或10&#xff0c;直接搜索Dev-C下载&#xff0c;或者sourceforge官网下载链接&#xff1a;https://sourceforge.net/projects/orwelldevcpp/…

stub_AccuREST Stub Runner发布

stub最近发布时间不错&#xff01; 我在Too Much Coding博客上的博客更多是关于发布&#xff0c;然后是关于任何具体主题;&#xff09; 在作为Brixton RC1的一部分发布Spring Cloud Sleuth之后&#xff0c;我们刚刚发布了AccuREST 1.0.4版本。 我们修复了一些错误&#xff0c;…

kali linux wifi监听模式,无线渗透教程1:监听无线网络

第一&#xff1a;配置管理无线网卡1.1这里&#xff0c;我们使用tplink wn722n, kali linux插上即用&#xff0c;无需安装驱动。1.2Vmare虚拟机配置如下&#xff1a;如网卡插入到电脑后&#xff0c;先将虚拟机设置成桥接模式之后对虚拟机进行配置之后呢&#xff0c;我们在终端窗…

matlab的7.3版本是什么_王者荣耀:玩不好元歌的3大原因,无论什么版本,元歌起码T1.5_电竞...

很多高段位元歌并不是以秀为核心的&#xff0c;而是他们就像一个冷静的杀手&#xff0c;在一闪即逝却又最合适的时机里&#xff0c;他能正确的选择进场的方式&#xff0c;以及击杀的方式。说白了&#xff0c;元歌的进场手段并没有多少&#xff0c;什么时候用傀儡433上去锁人&am…

【WebRTC---入门篇】(一)WebRTC整体架构

1.绿色部分是WebRTC核心部分(核心库) 2.紫色部分是JS提供的API(应用层) 整体是应用层调用核心层。 核心层,第一层 C++ API 提供给外面的接口。最主要的是(PeerConnedtion 对等连接)。 核心层,第二层 Session 上下文管理层(音视频)。 核心层,第三层[最重要的…

python 创建空的numpy数组_数据分析-NumPy内置函数创建数组

微信公众号&#xff1a;yale记关注可了解更多的教程问题或建议&#xff0c;请公众号留言。背景介绍今天学习使用numpy的内置函数arange()、ones()、zeros()、linspace() 等内置函数创建数组&#xff0c;对于使用数据结构和多维列表非常有用&#xff0c;可以节省大量的时间。入门…

使用t-sql语句修改表中的某些数据及数据类型。_数据库基本理论详细介绍

1、数据库范式第一范式&#xff1a;列不可分&#xff0c;eg:【联系人】(姓名&#xff0c;性别&#xff0c;电话)&#xff0c;一个联系人有家庭电话和公司电话&#xff0c;那么这种表结构设计就没有达到 1NF&#xff1b;第二范式&#xff1a;有主键&#xff0c;保证完全依赖。eg…

【WebRTC---入门篇】(三)WebRTC运行机制

轨和流 Track 轨&#xff1a;音频轨和视频轨是不相交的 MediaStream 媒体流&#xff1a;中包含多个音视频轨 WebRTC重要类 MediaStream 负责添加N个轨&#xff0c;加入到RTCPeerConnection RTCPeerConnection 核心 RTCDataChannel 非音视频数据&#xff0c;通过RTCP…

a - 数据结构实验之串一:kmp简单应用_【在线教学示范课案例】数据结构(刘航)...

一、教师简介刘航&#xff0c;网络空间安全学院教师&#xff0c;本科生“数据结构”、“算法设计综合实验” 和研究生“算法设计与优化”课程的主讲教师。近年来积极开展了教学与考核模式改革、探究式/研究型课程等课程改革探索&#xff0c;探索课程、学科竞赛和项目相结合的科…

【WebRTC---入门篇】(四)WebRTC设备管理

enumerateDevices API用来获取音视频设备 JS使用单线程处理&#xff0c;为了避免阻塞。使用异步调用Promise。handle为处理函数&#xff0c;处理主要逻辑。成功调用resolve&#xff1b;失败调用reject。Promise可以注册两个方法 then(逻辑处理成功会收到on_resolve) 和 catch(…

【音视频安卓开发 (六)】Android GLSurfaceView播放视频

GLSurfaceView渲染RGB的数据,利用双缓冲空间机制。取出缓冲地址,将要渲染的数据copy到缓冲地址. 获取Surface Java部分&#xff1a; SurfaceView控件设置到界面中显示 SurfaceView定义一个类来实现 package com.example.hello;import android.content.Context; import android…