文件操作
对文件操作过程
打开文件,得到文件句柄赋值给变量
操作
关闭文件
打开文件的模式有:
r,只读模式(默认)。
w,只写模式。【不可读;不存在则创建;存在则删除内容;】
a,追加模式。【可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
r+,可读写文件。【可读;可写;可追加】
w+,写读
a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
rU
r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
rb
wb
ab
#文件句柄 f = open(‘yesterday‘,‘r‘,encoding=‘utf-8‘) #r模式为读模式 f = open(‘yesterday‘,‘r‘,encoding=‘utf-8‘) #w模式为写,创建文件 f = open(‘yesterday2‘,‘w‘,encoding=‘utf-8‘) f.write("我爱北京天安门,\n") f.write("天安门上太阳升\n") #a模式为追加,创建文件 f = open(‘yesterday2‘,‘a‘,encoding=‘utf-8‘) f.write("我爱北京天安门,\n") f.write("天安门上太阳升\") #关闭文件 f.close() #读前5行 f = open(‘yesterday2‘,‘r‘,encoding=‘utf-8‘) for i in range(5): print (f.readline()) # 循环读每行 f = open(‘yesterday2‘,‘r‘,encoding=‘utf-8‘) for i in f.readlines(): print (i,) # 读前9行 count = 0 f = open(‘yesterday2‘,‘r‘,encoding=‘utf-8‘) for line in f: if count == 9: print (‘------我是分割线-------‘) count += 1 continue print (line.strip()) count += 1 #seek和tall用法 f = open(‘yesterday2‘,‘r‘,encoding=‘utf-8‘) print (f.tell()) print (f.readline().strip()) print (f.readline().strip()) print (f.readline().strip()) print (f.tell()) f.seek(0) print (f.readline().strip()) #强制刷新保存 f.flush() #截断 f = open(‘yesterday2‘,‘r‘,encoding=‘utf-8‘) f.truncate(10) #读写,r+,读和追加 f = open(‘yesterday2‘,‘r+‘,encoding=‘utf-8‘) print (f.readline()) print (f.readline()) print (f.readline()) f.write(‘-----diao----\n‘) print (f.readline()) #写读,w+,先创建一个文件 f = open(‘yesterday2‘,‘w+‘,encoding=‘utf-8‘) f.write(‘-----diao----\n‘) f.write(‘-----diao----\n‘) f.write(‘-----diao----\n‘) f.write(‘-----diao----\n‘) print (f.tell()) f.seek(10) print (f.readline()) f.write(‘should\n‘) #追加读,a+ #读二进制文件 f = open(‘yesterday2‘,‘rb‘) print (f.readline()) #写二进制文件 f = open(‘yesterday2‘,‘wb‘) f.write(‘hello\n‘.encode(‘utf-8‘)) f.close() #文件修改 f = open(‘yesterday2‘,‘r‘,encoding=‘utf-8‘) f_new = open(‘yesterday3‘,‘w‘,encoding=‘utf-8‘) for line in f: if ‘肆意的快乐‘ in line: line = line.replace(‘肆意的快乐等我享受‘,‘肆意的快乐等xxx享受‘) f_new.write(line) f.close()
with语句
with open(‘file_name‘, r) as f: ... # 在Python 2.7 后,with又支持同时对多个文件的上下文进行管理 with open(‘log1‘) as obj1, open(‘log2‘) as obj2: ...
字符编码与转码
需知:
在python2默认编码是ASCII, python3里默认是unicode
unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间
在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string
python2
#-*-coding:utf-8-*- 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 -*- #这个也可以去掉 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)
赋值及深浅拷贝
对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址
赋值
#赋值 #n1 n2指向同一内存地址,修改n1后n2依然指向之前的内存地址,n1内存地址变了 n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]} n2 = n1 print(id(n1)) print(id(n2)) n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]} print(id(n1)) print(id(n2)) print(n2)
浅拷贝
#复制列表,浅copy #增加一个内存指针指向已经存在的内存,只影响第一层 names = [‘ZhangYang‘,‘ZhaoYi‘,‘ShaoYiFan‘,‘JiaChen‘,‘MengLingJun‘,‘LiuLin‘,[‘YangRui‘]] names2 = names.copy() print (names,names2) import copy #浅copy,3中方式 person = [‘name‘,[‘saving‘,100]] ‘‘‘ p1 = copy.copy(person) p2 = person[:] p3 = list(person) ‘‘‘ p1 = person[:] p2 = person[:] p1[0] = ‘tom‘ p2[0] = ‘jane‘ p1[1][1] = 50 print (p1) print (p2)
深拷贝
import copy #复制列表,深copy #增加一个内存指针并申请一块新的内存 names2 = copy.deepcopy(names) names[3] = ‘汤姆‘ names[-1][0] = ‘杰克‘ print (names) print (names2)
时间: 2024-10-13 01:08:53