Python编码的历史:
二进制
ascll:只能存英文和拉丁字符,一个字符占一个字节,8位
gb2312:只能存6700多个中文,1980年
gbk1.0:存了2万多字符,1995年
gb18030:存了27000多个中文,2000年
万国码(Unicode):utf-32:是一个任意字符占4个字节的编码
utf-16:占两个字节或两个以上,65535,极个别不够用
utf-8(可变长编码):一个英文用ascll来存,一个中文占3个字节
in Python2:默认编码是ascll
inPython3:默认编码是Unicode,文件编码是utf-8
encode在编码的同时,会把数据转成bytes类型,在解码的同时会把bytes转成字符串(b=bytes=字节类型)
1 #in py2
2 s='特斯拉'
3 s_to_unicode=s.decode("utf-8")
4 unicode_to_gbk=s_to_unicode.encode("gbk")
5 print(s)
6 print("unicode:",s_to_unicode)
7 print("gbk:",unicode_to_gbk)
8
9 gbk_to_unicode=unicode_to_gbk.decode("gbk")
10 unicode_to_utf-8=gbk_to_unicode.encode("utf-8")
11 print(gbk_to_unicode)
12 print(unicode_to_utf-8)
13
14 #in py3
15 s="i like 特斯拉"
16 s_to_gbk=s.encode("gbk")
17 print(s)
18 print(s_to_gbk.decode("gbk"))
文件操作:
能调用方法的一定是对象。
创建对象: f=open('小重山','r',encoding='utf8')
三种基本操作模式:r(只可读),w(只可写),a(追加)
步骤:1、创建文件对象,2、调用文件方法进行操作,3、关闭文件(如果不关闭,数据会在缓存中,而不在磁盘)
read():参数写几就是读几个字符,一个汉字占一个字符
写模式是不可读的,读模式不能写
写模式在创建对象的同时会把原来的内容清空,如果文件不存在会创建新的文件
文件的操作方法:
f.readline():读出的是一行
f.readlines():读出的是全部内容,放在一个列表中
f.tell():识别光标的位置,中文默认一个占3个一个英文占一个
f.seek():调整光标的位置
f.flush():同步把缓存的内容放入磁盘
f.truncate():默认从开始位置截断所有的内容(在w模式下:先清空,再写,再截断,在a模式下:直接将指定位置后的内容截断)
1 #对文件进行操作:
2 '''
3 昨夜寒蛩不住鸣。
4 惊回千里梦,已三更。
5 起来独自绕阶行。
6 人悄悄,帘外月胧明。
7 白首为功名,旧山松竹老,阻归程。
8 欲将心事付瑶琴。
9 知音少,弦断有谁听。
10 '''
11 #在第六行后面加i like it
12 f=open('小重山2','r',encoding='utf8')
13 number = 0
14 for i in data:
15 number += 1
16 if number == 6:
17 i = ''.join([i.strip(), 'i like it']) # 取代万恶的+
18 print(i.strip())
19 f.close()
20
21 #对于大数据文件,要用以下方式
22 number=0
23 for i in f:
24 number+=1
25 if number==6:
26 i=''.join([i.strip(),'uygyuy'])
27 print(i.strip())
文件模式:
r(读模式) w(写模式) a(追加模式)
r+:读写模式,读后写的内容是在内容的最后,光标定位在开始的位置
f=open('小重山','r+',encoding='utf8')
print(f.readline())
f.write('岳飞')
f.close()
w+:写读模式,写前先清空,写了之后光标定位在写的最后位置,仍然读不到内容,要想读到所写的内容需要移动光标的位置
f=open('小重山','w+',encoding='utf8')
f.write('岳飞')
print(f.tell())
f.seek(0)
print(f.readline())
f.close()
a+:追加读模式,追加之后光标定位在最后的位置,读是从最后的位置开始读
f=open('小重山','a+',encoding='utf8')
print(f.tell())
f.seek(0)
print(f.readline())
f.close()
终极问题 如何在磁盘修改文件
常规思路,由于磁盘存储机制不能完成
number=0
for line in f:
number+=1
if number==3:
f.write('alex')
只能采取重新创建一个文件的思路
f_read=open('小重山','r',encoding='utf8')
f_write = open('小重山2','w',encoding='utf8')
number=0
for line in f_read:
number+=1
if number==5:
line=''.join([line.strip(),'alex
'])
f_write.write(line)
f_read.close()
f_write.close()
with 同时管理多个文件对象:
with open('log1','r') as f_read, open('log2','w') as f_write:
for line in f_read:
f_write.write(line)