Python基础day-5[字符编码,文件处理,函数(未完)]
字符编码:
为什么要有字符编码?字符编码是为了让计算机能识别我们人写的字符,因为计算机只认识高低电平,也就是二进制数"0","1".
字符编码其实就是在完成一件,字符====>数字的翻译过程.
ASCII:
最早计算机是美国发明的,所以最早诞生的ASCII码也是基于英文考虑的.ASCII码:一个Bytes代表一个字符,1Bytes=bit.最早的ASCII只用到后七位.
127个数字,已经完全能代表键盘了,后来又把127号之后的空位来表示新的字母、符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一个状态255。从128 到255这一页的字符集被称”扩展字符集“。
GBK标准:
等到中国使用计算机的时候,已经没有可利用的字节状态来表示汉字了,所以中国人发明了GBK标准,一个字符等于两个Bytes.GBK包括了GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。 后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK扩成了 GB18030。这一系列汉字编码的标准叫做 “DBCS“(Double Byte Charecter Set 双字节字符集).
UNICODE:
由于各国都有自己的一套像中国一样的编码标准,互相之间又看不懂对方的编码.所以ISO(国际标准化组织)制定了一种新的编码”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “unicode“.unicode规定必须用两个字节,也就是16位来统一表示所有的字符,对于ASCII里的那些“半角”字符,unicode包持其原编码不变,只是将其长度由原 来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于”半角”英文符号只需要用到低8位,所以其高8位永远是0,因此这种方案在保存英文文本时会多浪费一倍的空间.
UTF-8
UTF-8,对英文字符只用1Bytes表示,对中文字符用3Bytes.
补充:
计算机内存中使用的编码是unicode,用空间来换取时间,而硬盘或者网络传输则使用的是utf-8,来达到节省空间的目的.
计算机在存取数据的时候,以什么格式存的就需要以什么格式来解码.例如:数据在内存中使用unicode编码来保存,当数据要刷入硬盘时,就需要把数据用utf-8的标准转换成Bytes(二进制),保存在硬盘上,读取的时候就需要用utf-8的标准转换成unicode,如果保存和读取使用的编码不同会导致乱码.
python中的字符编码:
当我们在写一个Python文件的时候,这时候写的东西其实就是字符串,跟Python的命令没有任何关系,Python是一种解释语言,当我们用Python解释器去运行我们写的代码时,解释器会按照代码头声明的字符编码,先去硬盘读取数据,使用声明的字符编码解码转换成unicode编码,然后在解释执行.
python3三中,默认使用的编码是unicode编码,Python2中则需要手动指定,否则代码无法正常运行.Python2中的 str默认存的是Bytes.而不是像Python3一样默认存的是unicode.
Python使用 encode和decode 两个参数命令来编码和解码.
文件处理:
打开文件:
f = open('a.txt','w',encoding='utf-8')
#encoding 定义文件的读取方式 w表示覆盖写入打开,a是追加写入文件内容, r是只读模式
#rb,wb,ab 以Bytes读取文件,二进制模式 不需要指定encoding
f.write('安居客活动卡收到类似的看了\n3213213213213213\n')
#写入字符串 无自动换行 需加\n #同read Bytes模式
f = open('a.txt',encoding='utf-8')
print(f.read()) #读取文件所有内容,并打印出来 ()内写数字,根据字符来确定光标位置
#当以Bytes方式读取文件时,需要指定 encoding来正常显示
#关闭打开的文件
f.close()
#立即刷入写入内容
f.flush()
#判断文件是否关闭
f.closed
#查看文件名和字符编码
f.name,f.encoding
#移动光标
f.seek(0) #以文件起始作为参考,()内是字节来移动 (3,0/1/2) 0/1/2 分别代表 文件起始/当前位置/文件末尾
#告知当前光标位置
f.tell()
#截断(写操作) ()也是字节来判断
f.truncate()
小练习:
用户传入修改的文件名,与要修改的内容,执行函数,完成批了修改操作 def replace_str(fname,a,b): #定义三个传入参数 import os #导入os模块 if os.path.exists(fname): #判断文件是否存在 fp = open(fname,'r') #以只读模式打开用户输入的文件 ft = open('tmp','w') #以读写模式打开一个文件,不存在则自动创建 for line in fp: #for循环,一行一行取出用户输入文件的的所有内容 if a in line: #判断用户输入的 a参数,是否存在 line=line.replace(a,b) #修改并赋值 ft.write(line) #如果存在就把修改的内容写入文件 else: ft.write(line) #如果不存就把读取的内容重新写入新文件 fp.close() #关闭用户输入的文件 ft.close() #关闭新建的临时文件 os.remove(fname) #删除用户输入的文件 os.rename('tmp',fname) #把临时文件重命名为 用户输入的文件名 return #跳出函数 replace_str(r'E:\Python\Exercise\test.txt','abc','ABC') #调用函数 文件路径前面的 r是转义符,因为Windows使用的右斜杠所以需要转义 也可以输入两个 右斜杠\\依次转义
函数:
一 为何要有函数?
不加区分地将所有功能的代码垒到一起,问题是:
代码可读性差
代码冗余
代码可扩展差
如何解决?
函数即工具,事先准备工具的过程是定义函数,拿来就用指的就是函数调用
结论:函数使用必须是:先定义,后调用
二:函数的分类
1.内置函数:built-in
2.自定义函数:
def 函数名(参数1,参数2,...):
'''注释'''
函数体
示例:
def a(t,c,h): #传入三个参数,定义t:打印什么,c打印多少次,h打印几行
for i in range(h): #for循环,循环为h的次数
print(t*c) #打印内容t 和次数
定义函数分类
定义无参函数: 不依赖外部参数运行
def print()
print('111111')
定义有参函数: 依赖外部参数运行
def a(t,c,h):
for i in range(h):
print(t*c)
定义空函数: 函数体为pass
def <函数名>(x,y,z)
pass
调用函数的形式:
语句形式:
func()
表达式形式:
res=func()
作为参数形式:
print(func(10))
函数分为定义阶段和调用阶段:
函数和变量的定义方式相似
定义阶段:同样跟变量一样,在内存中开辟空间存储,只检查语法上的错误
调用阶段:调用阶段才会报函数的错误
def tets(): #这个函数定义的时候并不会报错,语法没有问题,逻辑有问题,并且在调用函数时报错 alkajhsdlaksld #识别为变量名,定义的时候没问题,但是调用的时候找不到变量名报错 def test1(): #这个函数定义的时候会报错 ,因为是语法错误 if 1 > 2 print('123')
浙公网安备 33010602011771号