Python编码和文件操作

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)

原文地址:https://www.cnblogs.com/cxli99/p/8433243.html