[转载] python中字符串编码形式及其所占字节

参考链接: Python中的字节对象与字符串

1.常见字符串编码错误 

在使用Python读文件时经常遇到编码问题引起的错误,比如: 

UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 30: illegal multibyte sequence 

遇到这种异常时可以通过读文件时规定编码方式来解决,如下: 

with open('zhengfu.txt','r',encoding='UTF-8') as read_zhengfu: 

如果文件中还包含其他非UTF-8编码的字符,或者无关的特殊字符,可以再加入一个参数,如下: 

with open('zhengfu.txt','r',encoding='UTF-8',errors='ignore') as read_zhengfu: 

有时读文件时还会遇到一种问题就是第一行数据的开头多了一串‘'\ufeff’字符。比如: 

 

如果用print(list[0])是看不到这个字符的。对这个没有研究过, 如果要去掉这串字符的话,可以使用‘utf-8-sig’这种编码方式: 

with open('user_dict_2.txt','r',encoding='utf-8-sig') as read_dict: 

但是我在写入文件时设置为‘utf-8-sig’格式时不起作用,写入的文件中还是有这个字符。 

另外,在对字符串进行匹配的时候,'\ufeff’会影响字符串的匹配结果。 

 

2.字符串编码 

关于计算机内部如何表示字符串,为何又要创造这么多种编码方式,推荐阅读 https://www.cnblogs.com/hhwu/p/9529942.html 这篇博客里作者讲的很明白,这里主要是想汇总介绍Python中的字符串函数。 

2.1 chr()函数和ord()函数 

chr()函数是将一个整数返回一个对应的字符,ord()函数则相反,其返回一个字符的数值表示(返回的是Unicode值的十进制表示)。在Python3.6的版本中,chr()中整数的范围不再是0到255,扩大到了1114111,大于改值时,报ValueError错误。而ord()函数中只能接受单字符串作为其输入,否则会报TypeError错误。 

print(chr(65)) #输出'A'

print(ord('A')) #输出65 

2.2 Unicode编码 

虽然Python 3的内存中Unicode来保存字符串,但为了节省内存,Python3内部使用3种方式存储Unicode字符。具体分为以下三种: 

Latin-1一个字符占一个字节。比如ASCII码值UCS-2一个字符占两个字节。常见的中文都占用2个字节UCS-4一个字符占四个字节。比较偏僻的中文还有emoj表情通常占用4个字节。

python中提供了内置函数来查看每个字符串对象的编码类型。如果一个字符串的所有字符都能用ASCII码来表示,那么该字符串使用Latin-1。如果字符串中出现了中文,则采用UCS-2编码即可。如果字符串中有一些生僻字或者emoj表情的话,则必须使用UCS-4编码。注意在Python中,一个字符串中的所有字符只能采用一种编码方式,不能混用。因为一旦混用,那么字符串中每个字符所占的字节数必定不同,那么字符串将不能使用下标进行快速直接读取。下面来具体看看字符串具体在内存中所占用的字节数。 

字符串的长度和该字符串所占的字节数不相同。字符串的长度可以直接通过len()f方法来求,而字符串在内存中实际所占的字节数需要通过getsizeof()函数来计算。 

import sys

#返回字符串所占字节数,返回78

print(sys.getsizeof('你好'))

#返回字符串长度,长度为2

print(len("你好")) 

从以下的实验结果可以发现,一个空字符串在内存中就占了49个字节的内存。 

 

Python内存中的数据,不管是int型还是字符串,都会额外占用一些内存空间保存一些信息,这些信息保存了字符串的一些基础信息,并且能够决定字符串所能进行的操作。Python一般会为字符串分配49到80个字节的额外空间。 

下面这段代码分别展示了字符‘a’在三种不用的Unicode编码中所占的字节数。 

import sys

#latin-1编码时'a'所占的字节数,其结果为:1

print(sys.getsizeof('ab')-sys.getsizeof('b'))

#ucs-2编码时'a'所占的字节数,其结果为:2

print(sys.getsizeof('a你好')-sys.getsizeof('你好'))

#ucs-4编码时'a'所占的字节数,其结果为:4

print(sys.getsizeof('a?')-sys.getsizeof('?'))

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

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

相关文章

[AtCoder-ARC073F]Many Moves

题目大意:   有一排n个格子和2枚硬币。   现在有q次任务,每一次要你把其中一枚硬币移到x的位置上,移动1格的代价是1。   两枚硬币不能同时移动,任务必须按次序完成。   现在告诉你两枚硬币初始状态所在的位置a和b&#xf…

ScalavsKotlin

Is Scala better that Kotlin? No..., Is Kotlin better than Scala? No... Scala比Kotlin更好吗? 不...,Kotlin胜过Scala吗? 没有... Both programming languages have their own profits and are for a specific set of development. It…

工业智能相机与基于PC的机器视觉的区别比较

随着科技的日渐成熟,机器视觉得到了飞速发展。由于嵌入式技术的发展,近几年智能相机性能显著提高,越来越多必须依赖于PC处理的应用开始向智能相机平台倾斜。低成本、高可靠性及易于安装维护等优势,使得机器视觉在制造业上的规模性应用越来越普…

[转载] python skimage在图像处理中的用法

参考链接: 在Python中打印单变量和多变量 基于python脚本语言开发的数字图片处理包,比如PIL,Pillow, opencv, scikit-image等。 PIL和Pillow只提供最基础的数字图像处理,功能有限;opencv实际上是一个c库,只是提供了py…

scala元组 数组_Scala中的数组

scala元组 数组Scala中的数组 (Arrays in Scala) An array is a linear data structure with a fixed number of elements. It is a collection that stores a fixed number Arrays in Scalf elements of the same datatype. In Scala, an array is 0 indexed, i.e. the first …

OpenStack —— DevStack一键自动化安装

一、DevStack介绍Devstack目前是支持Ubuntu16.04和CentOS 7,而且Devstack官方建议使用Ubuntu16.04,所以我们使用Ubuntu 16.04进行安装。默认无论是Devstack和OpenStack,都是采用Master的代码进行安装,这样经常会出现,今…

[转载] Python学习笔记——运维和Shell

参考链接: 在C / C,Python,PHP和Java中交换两个变量 目录 什么是运维 运维第一工具-shell编程 shell历史 执行脚本 基本语法 Shell脚本语法 条件测试:test [ if/then/elif/else/fi case/esac for/do/done …

scala java混合_Scala特性混合

scala java混合Scala | 特性混合 (Scala | Trait Mixins ) In Scala, the number of traits can be extended using a class or an abstract class. This is known as Trait Mixins. For extending, only traits, the blend of traits, class or abstract class are valid. If …

Scala铸造

Scala中的类型 (Types in Scala) Type also know as data type tells the compiler about the type of data that is used by the programmer. For example, if we initialize a value or variable as an integer the compiler will free up 4 bytes of memory space and it wi…

/ 卡路里_最大卡路里

/ 卡路里Problem statement: 问题陈述: Shivang is very foodie but he has a diet plan. He has an array of elements indicating the calorie of food he can consume on that day. In his diet plan, he can’t eat on for three consecutive days. But since …

[转载] Python类中的私有变量和公有变量

参考链接: Python中的私有变量 我们这里就直奔主题,不做基础铺垫,默认你有一些Python类的基础,大家在看这篇博客的时候,如果基础知识忘了,可以去菜鸟教程 从一个简单的类开始 class A(): #定义一…

OpenCV探索之路(二十五):制作简易的图像标注小工具

搞图像深度学习的童鞋一定碰过图像数据标注的东西,当我们训练网络时需要训练集数据,但在网上又没有找到自己想要的数据集,这时候就考虑自己制作自己的数据集了,这时就需要对图像进行标注。图像标注是件很枯燥又很费人力物力的一件…

固件的完整形式是什么?

FW:前进 (FW: Forward) FW is an abbreviation of "Forward". FW是“ Forward”的缩写 。 It is an expression, which is commonly used in Gmail or messaging platform. It is also written as FWD or Fwd or Fw. It shows that the email has been s…

[转载] python __slots__ 详解(上篇)

参考链接: Python的__name __(特殊变量) python中的new-style class要求继承Python中的一个内建类型, 一般继承object,也可以继承list或者dict等其他的内建类型。 在python新式类中,可以定义一个变量__slots__,它的作…

委托BegionInvoke和窗体BegionInvoke

委托BegionInvoke是指通过委托方法执行多线程任务,例如: //定义委托成员变量 delegate void dg_DeleAirport(); //指定委托函数 dg_DeleAirport dga AirportBLL.DeleteHistoryTransAirport; //通过BeginInvoke以异步线程方式执行委托函数,可…

图论 弦_混乱的弦

图论 弦Problem statement: 问题陈述: You are provided an input string S and the string "includehelp". You need to figure out all possible subsequences "includehelp" in the string S? Find out the number of ways in which the s…

[转载] Python列表操作

参考链接: Python中的基本运算符 Python列表: 序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推; Python有6个序列的…

「原创」从马云、马化腾、李彦宏的对话,看出三人智慧差在哪里?

在今年中国IT领袖峰会上,马云、马化腾、李彦宏第一次单独合影,同框画面可以说很难得了。BAT关心的走势一直是同行们竞相捕捉的热点,所以三位大Boss在这次大会上关于人工智能的见解,也受到广泛关注与多方解读。马云认为机器比人聪明…

python 注释含注释_Python注释

python 注释含注释Python注释 (Python comments) Comments in Python are used to improve the readability of the code. It is useful information given by the programmer in source code for a better understanding of code and logic that they have used to solve the …