第二章 字符串处理与编码不再发愁

2.1 字符串

   2.1.1 字符串转换

>>> a = 123

>>> b = 1.23

>>> type(a)

<type 'int'>

>>> type(b)

<type 'float'>

>>> type(str(a))

<type 'str'>

>>> type(str(b))

<type 'str'>

说明:先定义个整数和浮点数,再查看类型,用str()函数将对象转成字符串。

这里的用到了type()函数,用于查看对象类型。这个type()在以后学习中很用的,刚开始学习时候,往往因为对象类型不对,导致程序运行报错,这时可以用它来排查问题。 

   2.1.2 字符串连接

# 加号字符将同类型字符连接到一起

>>> hw = "Hello" + "World!"

>>> print hw

HelloWorld!

# 两个相邻的字符串自动连接一起

>>> hw = "Hello""World!"

>>> print hw

HelloWorld!

# 如果字符串内包括单引号或双引号,要用\转义,否则报错,上一章也讲过。

>>> hw = "Hello \"World!\""

>>> print hw

Hello "World!"

# 不同字符串类型拼接

>>> a = "abc"

>>> b = 1

>>> print a + b

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: cannot concatenate 'str' and 'int' objects

说明:不同字符串类型不允许连接,想要连接可以下面这么做。

方法1:

>>> c = "%s%d" %(a,b)

>>> print c

abc1

方法2:

>>> c = a + str(b)

>>> print c

abc1

   2.1.3 格式化输出


操作符号

说明

%s

字符串(str())

%r

字符串(repr())

%d

整数

%f

浮点数,可指定小数点后的精度

       1) 字符串格式输出三种方法

>>> xxoo = "string"

>>> print "%s" %xxoo

string

>>> print "%r" %xxoo

'string'

>>> print `xxoo`   

'string'

        说明:%s采用str()函数显示,%r采用repr()函数显示。repr()和反撇号把字符串转为Python表达式。

       2) 保留小数点数

>>> '%.1f' %(float(100)/1024)

'0.1'

     2.1.4 字符串处理

     

     上图是字符串处理的方法,红色框框中大概有一半经常用的,我们就拿一部分常用的来举例说明。

#!/usr/bin/env python

# -*- coding: utf-8 -*-

xxoo = "Hello world!"

print "字符串长度: %s" % len(xxoo)

print "首字母大写: %s" % xxoo.capitalize()

print "字符l出现次数: %s" % xxoo.count('l')

print "感叹号是否结尾: %s" % xxoo.endswith('!')

print "w字符是否是开头: %s" % xxoo.startswith('w')

print "w字符索引位置: %s" % xxoo.find('w') # xxoo.index('W')

print "格式化字符串: Hello{0} world!".format(',')

print "是否都是小写: %s" % xxoo.islower()

print "是否都是大写: %s" % xxoo.isupper()

print "所有字母转为小写: %s" % xxoo.lower()

print "所有字母转为大写: %s" % xxoo.upper()

print "感叹号替换为句号: %s" % xxoo.replace('!','.')

print "以空格分隔切分成列表: %s" % xxoo.split(' ')

print "转换为一个列表: %s" % xxoo.splitlines()

print "去除两边空格: %s" % xxoo.strip()

print "大小写互换: %s" % xxoo.swapcase()

print "只要Hello字符串: %s" % xxoo[0:5]

print "去掉倒数第一个字符: %s" % xxoo[0:-1]

# python test.py

字符串长度: 12

首字母大写: Hello world!

字符l出现次数: 3

感叹号是否结尾: True

w字符是否是开头: False

w字符索引位置: 6

格式化字符串: Hello, world!

是否都是小写: False

是否都是大写: False

所有字母转为小写: hello world!

所有字母转为大写: HELLO WORLD!

感叹号替换为句号: Hello world.

以空格分隔切分成列表: ['Hello', 'world!']

转换为一个列表: ['Hello world!']

去除两边空格: Hello world!

大小写互换: hELLO WORLD!

只要Hello字符串: Hello

去掉倒数第一个字符: Hello world

博客地址:http://lizhenliang.blog.51cto.com and https://yq.aliyun.com/u/lizhenliang
QQ群:323779636(Shell/Python运维开发群)

2.2 编码

   2.2.1 常见字符编码类型

     ASCII:美国信息交换标准码,是目前计算机中最广泛使用的字符集编码。每个ASCII码以1个字节存储,例如数字字符0的ASCII码是0110000,十进制表示为48。

     Unicode:为解决世界上上百种语言带来混合、冲突,各国有各国的标准,显示很容易出现乱码。Unicode就出现了,它把所有语言的字符都统一到一套Unicode编码中,并定义每个语言字符的标准,所以Unicode又称统一码,万国码。大部分编程语言都支持Unicode,Python内部编码也支持Unicode。

     GB2312:中国国家标准总局发布处理汉字的标准编码。

     GBK:GB2312的扩展,向下兼容GB2312。 

     UTF-8:针对Unicode的可变长度字符编码,又称万国码。支持中文简体繁体及其它语言(如英文,日文,韩文)。

   2.2.3 decode()

     decode()函数作用是将其他编码(比如ACSII、Byte String)的字符串解码成Unicode。

   2.2.4 encode()

     encode()函数作用是将Unicode编码成终端软件能是识别的编码,就能正常显示了,比如UTF-8、GBK。

   2.2.5 Python编码处理

#!/usr/bin/env python

c = "中文"

print c

# python test.py

  File "test.py", line 2

SyntaxError: Non-ASCII character '\xe4' in file test.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

说明:在程序里面直接打印中文,会报语法错误,这是因为Python默认编码是ASCII,无法处理其他编码。

如果想打印中文,需要声明编码为utf-8,上面也有写过:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

c = "中文"

print c

print type(c)

# python test.py

中文

<type 'str'>

可以正常输出中文了,类型是字符串,这个字符串是经过Python unicode编码后字节组成的。

虽然可以正常输入中文,并不意味的就万事大吉了,如果终端编码不是utf-8或其他软件也不确定编码还会出现乱码情况。所以还是要明白Python处理编码逻辑关系,才能更好的应对编码问题。

   切换到交互式解释器:

>>> c = "中文"

>>> c.encode('utf-8')

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

    如果直接转成utf-8是不允许的,报错Unicode解码错误,大概意思是说ascii码不能解码字节字符串。

    上面讲到encode()函数作用是将Unicode码解码,而现在的c变量并非是Unicode码,而是字节字符串,算是Unicode的一种吧?。

    故此,不能使用encode(),而是先使用decode()先解码陈Unicode再用encode()编码成utf-8。

>>> c.decode('utf-8')

u'\u4e2d\u6587'       # 4e2d对应unicode值是"中",6587对应unicdoe值是"文"

>>> type(c.decode('utf-8'))

<type 'unicode'>

>>> print c.decode('utf-8')    ?

中文

>>> print c.decode('utf-8').encode('utf-8')

中文

    如果是Unicode字符串可直接通过encode()函数转码其他编码。

>>> c = u'中文'

>>> c.encode('utf-8')

'\xe4\xb8\xad\xe6\x96\x87'

>>> print c.encode('utf-8')

中文

    看下字节字符串和unicode字符串区别:

>>> c = '中文'

>>> u = u'中文'

>>> c

'\xe4\xb8\xad\xe6\x96\x87'

>>> u

u'\u4e2d\u6587'

>>> len(c)

6

>>> len(u)

2

    字节字符串长度要比unicode长的多,而unicode长度就是字符长度。

    总结下:Python处理编码流程大致是这样的,ascii --> decode() --> unicode --> encode() --> 终端是能识别的编码,unicode算是一个中间码,有着承上启下的作用。

时间: 2024-10-30 03:38:04

第二章 字符串处理与编码不再发愁的相关文章

&amp;gt; 第二章 NGWS Runtime 技术基础(rainbow 翻译) (转自重粒子空

<<展现C#>> 第二章 NGWS Runtime 技术基础(rainbow 翻译)   出处:http://www.informit.com/matter/ser0000001/chapter1/ch02.shtml 正文: 第二章  NGWS  runtime 技术基础     既然你已经具有了C#全面的印象,我也想让你了解NGWS runtime的全貌.C#依靠由NGWS提供的运行时:因此,有必要知道运行时如何工作,以及它背后所蕴含的概念.    所以,这一章分为两部分--它

《.net编程先锋C#》第二章 理论基础-公用语言 运行环境(转)

编程 第二章 理论基础-公用语言 运行环境既然你已经具有了C#全面的印象,我也想让你了解NGWS runtime的全貌.C#依靠由NGWS提供的运行时:因此,有必要知道运行时如何工作,以及它背后所蕴含的概念.所以,这一章分为两部分--它们是所有的概念和使用的基础.两部分的内容虽然有些重叠,但它有助于加深理解正在学习的概念. 2.1 NGWS RuntimeNGWS和NGWS Runtime为你提供了一种运行时环境.该运行时管理执行代码,并提供了使编程更容易的服务.只要你的编译器支持这种运行时,你

Java初级笔记-第二章

第二章 Java的基本数据类型.运算符及表达式 2.1 标识符 标识符是程序员对程序中的各个元素加以命名时使用的命名记号. A-Z.a-z.0-9._.$ 第一个字母不可以是数字(0-9), 标识符中的字符是区分大小写的,Java的代码是严格区分大小写的.  标识符不可以是中文. 2.2 标识符的使用规范 不可以用关键字.保留字和中文字符 标识符使用在:常量名.变量名.类名(文件名).包名.方法名 命名规则:  包名全小写.Eg:axx.bxxx.cxx  类名单词的首字母大写(大驼峰规则

第二章、进程的描述与控制

第二章.进程的描述与控制 2.1 前趋图和程序执行 2.1.1 前趋图 概念: 所谓前趋图:指一个有向无循环图(DAG),它用于描述进程之间执行的先后顺序. 2.1.2 程序顺序执行 特征: 顺序性 封闭性:指程序在封闭的环境中运行,程序运行时独占全机资源,资源的状态只有本程序才能改变,程序一旦开始执行,其执行结果不受外界因素影响 可再现性:只要条件相同还会得到相同的执行结果. 2.1.3 程序并发执行 特征: 间断性 失去封闭性 不可在现性 2.2进程的描述 2.2.1 进程的定义和特征 定义

Programming MS Office 2000 Web Components第二章第二节

web 第二章第二节 电子表格组件的高级功能 我们已经讨论了电子表格组件的大部分基本功能,现在让我们转向一些高级功能.大部分的这些高级功能Excel2000都不包含,因为这些是组件专门需要的特殊功能.而那些Excel2000中存在的功能,在电子表格组件中也被增强,使得可以提供一些新的功能. 属性绑定和实时数据 "属性绑定"是电子表格组件中最新奇的新功能之一,它是指控件能够将同一个web页面上其它对象的属性和方法用作单元值或公式参数的能力.电子表格控件使用标准的COM机制来实现绑定到属性

经典中的品味:第二章 C++基本的对象,类型和值(上)

2.1 一个简单问候的例子 最常见的就是keyBorad input(键盘输入).从HelloWorldd的输出,我们也想得到用户的输入.通常,实行中的程序会给它的输入产生输出.例如,输入你的名字,输出 一句问候.有时候它就在身边,像我最爱的苹果手机一样.人机交互就是那么简单~ 图2.1.1 人机交互(.net) 回 到技术点,为了读取用户输入的数据,我们需要在计算机内存中某个地方放置读取所需的内容.这就是对象(Class).对象是什么,对象时一个某种类型的内 存区域.其中类型则确定了对象的信息

java 程序性能优化《第二章》设计优化 2.1善用设计模式 1 单例模式

java 程序性能优化<第二章>设计优化 2.1善用设计模式 1 单例模式 设计模式是前人工作的总结和提炼.通常,被人们广泛流传的设计模式都是对某一特定问题的成熟的解决方案.如果能合理的使用设计模式,不仅能使系统更容易被他人理解,同时也能使系统拥有更加合理的结构.本节总结归纳了一些经典的设计模式,并详细说明它们与软件性能之间的关系. 2.1.1 单例模式 单例模式是设计模式中使用最为普遍的模式之一.它是一种对象创建模式,用于生产一个对象的具体实现,它可以确保系统中一个类只产生一个实例.在Jav

第二章排错的工具:调试器Windbg(上)

感谢博主 http://book.51cto.com/art/200711/59731.htm <Windows用户态程序高效排错>第二章主要介绍用户态调试相关的知识和工具.本文主要讲了排错的工具调试器Windbg.     第二章 汇编.异常.内存.同步和调试器--重要的知识点和神兵利器 这一部分主要介绍用户态调试相关的知识和工具.包括汇编.异常exception.内存布局.堆heap.栈stack.CRTC Runtime.handle/Criticalsection/thread con

magento开发 -- 深入理解Magento第二章

  第二章 - Magento请求分发与控制器 Model-View-Controller (MVC) ,模型-视图-控制器,源于Smalltalk编程语言和Xerox Parc.现在有很多系统是基于MVC架构的,不同的系统MVC的实现也略有不同,但都体现了MVC的精髓,分离数据,业务逻辑和显示逻辑.最常见的PHP MVC框架是这样的 URL请求被一个PHP文件拦截,通常称为前端控制器(Front Controller) 这个PHP文件分析这个URL,获得一个执行控制器(Action Contr