python文件数据类型_python数据类型

1.Number

int (整数), 如 1, 只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。

bool (布尔), 如 True。

float (浮点数), 如 1.23、3E-2

complex (复数), 如 1 + 2j、 1.1 + 2.2j

常用操作

>>>5 + 4 # 加法

9

>>> 4.3 - 2 # 减法

2.3

>>> 3 * 7 # 乘法

21

>>> 2 / 4 # 除法,得到一个浮点数

0.5

>>> 2 // 4 # 除法,得到一个整数

0

>>> 17 % 3 # 取余

2

>>> 2 ** 5 # 乘方

32

注意

1、Python可以同时为多个变量赋值,如a, b = 1, 2。

2、一个变量可以通过赋值指向不同类型的对象。

3、数值的除法包含两个运算符:/ 返回一个浮点数,// 返回一个整数。

4、在混合计算时,Python会把整型转换成为浮点数。

2.String

特性:不可修改

常用函数

name = "tom cherry"

name.capitalize() #首字母大写

name.casefold() #大写全部变小写

name.center(50,"-") #输出 '---------------------Alex Li----------------------'

name.ljust(40,"-")

name.rjust(40,"-")

name.count('lex') #统计 lex出现次数

name.encode() #将字符串编码成bytes格式

name.endswith("Li") #判断字符串是否以 Li结尾

"Alex\tLi".expandtabs(10) #输出'Alex Li', 将\t转换成多长的空格

name.find('A') #查找A,找到返回其索引, 找不到返回-1

name.index('o') #返回a所在字符串的索引

"1_basda".isidentifier() #检测一段字符串可否被当作标志符,即是否符合变量命名规则

format

>>> msg = "my name is {}, and age is {}"

>>> msg.format("alex",22)

'my name is alex, and age is 22'

>>> msg = "my name is {1}, and age is {0}"

>>> msg.format("alex",22)

'my name is 22, and age is alex'

>>> msg = "my name is {name}, and age is {age}"

>>> msg.format(age=22,name="ale")

'my name is ale, and age is 22'

format_map

>>> msg.format_map({'name':'alex','age':22})

'my name is alex, and age is 22'

maketrans()

>>> intab = "aeiou" #This is the string having actual characters.

>>> outtab = "12345" #This is the string having corresponding mapping character

>>> trantab = str.maketrans(intab, outtab)

>>>

>>> str = "this is string example....wow!!!"

>>> str.translate(trantab)

'th3s 3s str3ng 2x1mpl2....w4w!!!'

partition()

#partition() 方法用来根据指定的分隔符将字符串进行分割。

#返回一个3元的元组,第一个为分隔符左边的子串,第二个为分隔符本身,第三个为分隔符右边的子串。

#不存在返回,第一个是原子串,第二个和第三个是“”

>>> msg = "1+2+3-4"

>>> msg.partition('+')

('1', '+', '2+3-4')

>>> msg.partition('5')

('1+2+3-4', '', '')

replace()

#replace()方法替换字符串

#返回字符串中的 old(旧字符串) 替换成 new(新字符串)后生成的新字符串,如果指定第三个参数max,则替换不超过 max 次。

>>> "alex li, chinese name is lijie".replace("li","LI",1)

'alex LI, chinese name is lijie'

>>> "alex li, chinese name is lijie".replace("li","LI",2)

'alex LI, chinese name is LIjie'

swapcase()

#swapcase() 方法用于对字符串的大小写字母进行转换。

#返回大小写字母转换后生成的新字符串。

>>> str = "aBcdEf"

>>> str.swapcase()

'AbCDeF'

zfill()

#Python zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0。

#返回指定长度的字符串。

>>> str.zfill(40)

'0000000000000000000000000000000000aBcdEf'

判断函数

'9aA'.isalnum() #判断是否字母或数字

'9'.isdigit() #检测字符串是否只由数字组成。

'10'.isnumeric() #检测字符串是否只由数字组成。只针对unicode对象。

'sdasdas'.isprintable() #检查所传的字符是否是可打印的。除了ttl和打印机等设备

' '.isspace() #判断是不是空字符

'Tom Cherry'.istitle() #判断是否首字母是大写

'ABC'.isupper() #判断字符是否是大写

#isdigit isdecimal isnumeric的区别

num = "1" #unicode

num.isdigit() # True

num.isdecimal() # True

num.isnumeric() # True

num = "1" # 全角

num.isdigit() # True

num.isdecimal() # True

num.isnumeric() # True

num = b"1" # byte

num.isdigit() # True

num.isdecimal() # AttributeError 'bytes' object has no attribute 'isdecimal'

num.isnumeric() # AttributeError 'bytes' object has no attribute 'isnumeric'

num = "IV" # 罗马数字

num.isdigit() # True

num.isdecimal() # False

num.isnumeric() # True

num = "四" # 汉字

num.isdigit() # False

num.isdecimal() # False

num.isnumeric() # True

具体区别

isdigit()

True: Unicode数字,byte数字(单字节),全角数字(双字节),罗马数字

False: 汉字数字

Error: 无

isdecimal()

True: Unicode数字,,全角数字(双字节)

False: 罗马数字,汉字数字

Error: byte数字(单字节)

isnumeric()

True: Unicode数字,全角数字(双字节),罗马数字,汉字数字

False: 无

Error: byte数字(单字节)

3.bytes

str = "中文"

str.encode(‘utf-8’) #编码后的数据是bytes数据

python2

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

__author__ = 'Alex Li'

import sys

print(sys.getdefaultencoding())

msg = "我爱北京天安门"

msg_gb2312 = msg.decode("utf-8").encode("gb2312")

gb2312_to_gbk = msg_gb2312.decode("gbk").encode("gbk")

print(msg)

print(msg_gb2312)

print(gb2312_to_gbk)

python3

#-*-coding:gb2312 -*- #这个也可以去掉

__author__ = 'Alex Li'

import sys

print(sys.getdefaultencoding())

msg = "我爱北京天安门"

#msg_gb2312 = msg.decode("utf-8").encode("gb2312")

msg_gb2312 = msg.encode("gb2312") #默认就是unicode,不用再decode,喜大普奔

gb2312_to_unicode = msg_gb2312.decode("gb2312")

gb2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8")

print(msg)

print(msg_gb2312)

print(gb2312_to_unicode)

print(gb2312_to_utf8)

总结:

1.在python2默认编码是ASCII, python3里默认是unicode

2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间

3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string

4.编码

在py2中,有两种字符串类型:str类型和unicode类型;str类型存ASCII数据,unicode类型存unicode数据

在 py3也有两种数据类型:str和bytes; str类型存unicode数据,bytse类型存bytes数据

py3对是对文本和二进制数据作了更为清晰的区分,不再会对bytes字节串进行自动解码。

编码类型

Ascii

记住一句话:计算机中的所有数据,不论是文字、图片、视频、还是音频文件,本质上最终都是按照类似 01010101 的二进制存储的。

再说简单点,计算机只懂二进制数字!

所以,目的明确了:如何将我们能识别的符号唯一的与一组二进制数字对应上?于是美利坚的同志想到通过一个电平的高低状态来代指0或1,

八个电平做为一组就可以表示出

256种不同状态,每种状态就唯一对应一个字符,比如A--->00010001,而英文只有26个字符,算上一些特殊字符和数字,128个状态也够

用了;每个电平称为一个比特为,约定8个比特位构成一个字节,这样计算机就可以用127个不同字节来存储英语的文字了。这就是ASCII编码。

扩展ANSI编码

刚才说了,最开始,一个字节有八位,但是最高位没用上,默认为0;后来为了计算机也可以表示拉丁文,就将最后一位也用上了,

从128到255的字符集对应拉丁文啦。至此,一个字节就用满了!

GB2312

计算机漂洋过海来到中国后,问题来了,计算机不认识中文,当然也没法显示中文;而且一个字节所有状态都被占满了,万恶的帝国主义亡

我之心不死啊!我党也是棒,自力更生,自己重写一张表,直接生猛地将扩展的第八位对应拉丁文全部删掉,规定一个小于127的字符的意

义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到0xF7,后面一个字节

(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了;这种汉字方案叫做 “GB2312”。GB2312 是对 ASCII 的中文扩展。

GBK 和 GB18030

但是汉字太多了,GB2312也不够用,于是规定:只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的

内容。结果扩展之后的编码方案被称为 GBK 标准,GBK 包括了 GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。

UNICODE

很多其它国家都搞出自己的编码标准,彼此间却相互不支持。这就带来了很多问题。于是,国际标谁化组织为了统一编码:提出了标准编码准

则:UNICODE 。

UNICODE是用两个字节来表示为一个字符,它总共可以组合出65535不同的字符,这足以覆盖世界上所有符号(包括甲骨文)

Utf-8

unicode都一统天下了,为什么还要有一个utf8的编码呢?

大家想,对于英文世界的人们来讲,一个字节完全够了,比如要存储A,本来00010001就可以了,现在吃上了unicode的大锅饭,

得用两个字节:00000000 00010001才行,浪费太严重!

基于此,美利坚的科学家们提出了天才的想法:utf8.

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,它可以使用1~4个字节表示一个符号,根据

不同的符号而变化字节长度,当字符在ASCII码的范围时,就用一个字节表示,所以是兼容ASCII编码的。

这样显著的好处是,虽然在我们内存中的数据都是unicode,但当数据要保存到磁盘或者用于网络传输时,直接使用unicode就远不如utf8省空间啦!

这也是为什么utf8是我们的推荐编码方式。

Unicode与utf8的关系:

​ 一言以蔽之:Unicode是内存编码表示方案(是规范),而UTF是如何保存和传输Unicode的方案(是实现)这也是UTF与Unicode的区别。

文件从磁盘到内存的编码:

答案是,通过某种编码方式编码的bytes字节串。比如utf8---一种可变长编码,很好的节省了空间;当然还有历史产物的gbk编码等等。于是,在我们的文本编辑器软件都有默认的保存文件的编码方式,比如utf8,比如gbk。当我们点击保存的时候,这些编辑软件已经"默默地"帮我们做了编码工作。

那当我们再打开这个文件时,软件又默默地给我们做了解码的工作,将数据再解码成unicode,然后就可以呈现明文给用户了!所以,unicode是离用户更近的数据,bytes是离计算机更近的数据。

当然有啦,py2默认ASCII码,py3默认的utf8,可以通过如下方式查询

`import` `sys``print``(sys.getdefaultencoding())`

大家还记得这个声明吗?

`#coding:utf8`

是的,这就是因为如果py2解释器去执行一个utf8编码的文件,就会以默认地ASCII去解码utf8,一旦程序中有中文,自然就解码错误了,所以我们在文件开头位置声明 #coding:utf8,其实就是告诉解释器,你不要以默认的编码方式去解码这个文件,而是以utf8来解码。而py3的解释器因为默认utf8编码,所以就方便很多了。

常见问题

1 cmd下的乱码问题

hello.py

`#coding:utf8``print` `(``'苑昊'``)`

文件保存时的编码也为utf8。

思考:为什么在IDE下用2或3执行都没问题,在cmd.exe下3正确,2乱码呢?

​ 我们在win下的终端即cmd.exe去执行,大家注意,cmd.exe本身也一个软件;当我们python2 hello.py时,python2解释器(默认ASCII编码)去按声明的utf8编码文件,而文件又是utf8保存的,所以没问题;问题出在当我们print'苑昊'时,解释器这边正常执行,也不会报错,只是print的内容会传递给cmd.exe用来显示,而在py2里这个内容就是utf8编码的字节数据,可这个软件默认的编码解码方式是GBK,所以cmd.exe用GBK的解码方式去解码utf8自然会乱码。

py3正确的原因是传递给cmd的是unicode数据,cmd.exe可以识别内容,所以显示没问题。

明白原理了,修改就有很多方式,比如:

`print` `(u``'苑昊'``)`

改成这样后,cmd下用2也不会有问题了。

2 open()中的编码问题

创建一个hello文本,保存成utf8:

苑昊,你最帅!

同目录下创建一个index.py

f=open('hello')

print(f.read())

为什么 在linux下,结果正常:苑昊,在win下,乱码:鑻戞槉(py3解释器)?

因为你的win的操作系统安装时是默认的gbk编码,而linux操作系统默认的是utf8编码;

当执行open函数时,调用的是操作系统打开文件,操作系统用默认的gbk编码去解码utf8的文件,自然乱码。

解决办法:

f=open('hello',encoding='utf8')

print(f.read())

如果你的文件保存的是gbk编码,在win 下就不用指定encoding了。

另外,如果你的win上不需要指定给操作系统encoding='utf8',那就是你安装时就是默认的utf8编码或者已经通过命令修改成了utf8编码。

注意:open这个函数在py2里和py3中是不同的,py3中有了一个encoding=None参数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值