前言:
今天在准备数据集的时候,为了将数据集进行格式转换和图片和文件分离专门用Python写了脚本,这个脚本几天前还是正常的,但是几天后就出bug了无法生成目标数据集,现在还没找到为什么提前结束循环,因此决定开始系统的学习一下这一部分的Python。有时候我觉得大学里面管的太严了,根本不让你有时间学自己的东西,导致现在很多人很狼狈。
第7章 字符串
一、Python 中的字符串特性
Python 中的字符串属于不可变有序序列,使用单引号(')、双引号(")或三引号(''' 或 """)作为定界符,并且不同的引号可以相互嵌套。下面是几种合法的 Python 字符串:
-
'abc'
-
'123, 中国'
(包含中文字符) -
"python"
-
'Tom said, "Let\'s go"'
除了支持序列通用操作(包括双向索引、比较大小、计算长度、元素访问、切片等)以外,字符串类型还支持一些特有的用法,如字符串格式化、查找、替换等操作。由于字符串属于不可变序列,不能直接对字符串对象进行元素增加或修改。字符串切片操作也只能用于访问其中的元素,而不能修改其中的字符。此外,字符串对象提供的 replace()
和 translate()
方法以及许多排版方法都不是对原字符串直接修改,而是返回一个新字符串作为结果。
如果需要判断一个变量是否为字符串,可以使用内置方法 isinstance()
或 type()
。
除了支持 Unicode 编码的 str
类型之外,Python 还支持字节串类型 bytes
。str
类型字符串可以通过 encode()
方法使用指定的编码格式转为 bytes
对象,而 bytes
对象则可以通过 decode()
方法解码为 str
字符串。此外,还可以使用内置函数 str()
和 bytes()
在这两种类型之间进行转换。
示例:
>>> type('中国')
<class 'str'>
>>> type('中国'.encode('gbk')) # 编码成字节串,采用 GBK 编码格式
<class 'bytes'>
>>> isinstance('中国', str)
True
>>> type('中国'.encode()) == bytes # 默认使用 UTF-8 编码
True
>>> '中国'.encode() # 编码为字节串
b'\xe4\xb8\xad\xe5\x9b\xbd'
>>> _.decode() # 解码为字符串
'中国'
>>> bytes('董付国', 'gbk') # 创建字节串,使用 GBK 编码
b'\xb6\xad\xb8\xb6\xb9\xfa'
>>> str(_, 'gbk') # 解码字节串
'董付国'
7.1 字符串编码格式简介
最早的字符串编码是美国标准信息交换码 ASCII,仅对 10 个数字、26 个大写英文字母、26 个小写英文字母及一些其他符号进行了编码。ASCII 码采用一个字节来对字符进行编码,最多只能表示 256 个符号。
随着信息技术的发展和信息交换的需要,各国的文字都需要进行编码,不同的应用领域和场合对字符串编码的要求也略有不同,因而设计了多种不同的编码格式,常见的有:UTF-8、UTF-16、UTF-32、GB2312、GBK、CP936、base64、CP437 等。
-
UTF-8 对全世界所有国家需要用到的字符进行了编码。一个字节表示英语字符(兼容 ASCII),3 个字节表示常用汉字,有些语言符号使用 2 个字节(如俄语和希腊语符号)或 4 个字节。
-
GB2312 是中国制定的中文编码,使用一个字节表示英语字符,两个字节表示中文。
-
GBK 是 GB2312 的扩充,CP936 是微软公司在 GBK 基础上开发的编码方式。这些编码格式都使用两个字节表示中文字符。
不同编码格式之间差异很大,采用不同的编码意味着不同的表示和存储形式,把同一字符存入文件时,写入的内容可能会不同,因此在理解其内容时必须了解编码规则并进行正确的解码。如果解码方法不正确,则无法还原信息,从这个角度来看,字符串编码也具有一定的加密效果。
Python 3.x 完全支持中文字符,默认使用 UTF-8 编码格式。无论是一个数字、英文字母,还是一个汉字,计算字符串长度时都按一个字符对待。在 Python 3.x 中甚至可以使用中文作为变量名、函数名等标识符,这在示例中也曾演示过。
示例:
>>> import sys
>>> sys.getdefaultencoding() # 查看默认编码格式
'utf-8'
>>> s = '中国山东烟台'
>>> len(s) # 字符串长度,按字符个数计
6
>>> s = '中国山东烟台ABCDE'
>>> len(s)
11
>>> 姓名 = '张三' # 使用中文作为变量名
>>> print(姓名) # 输出变量的值
张三