周二,晴,记录生活分享点滴
参考博客:https://www.cnblogs.com/yuanchenqi/articles/5782764.html
Python版本:3.5
文件操作基本流程
需知:能调用方法的一定是对象
li=[1,2,3] #li是对象 li.append('2') #li是对象 'asc'.capitalize() #asc是对象
流程:1.创建文件对象 2.调用文件方法进行操作 3.关闭文件
昨夜寒蛩不住鸣。
惊回千里梦,已三更。
起来独自绕阶行。
人悄悄,帘外月胧明。
白首为功名,旧山松竹老,阻归程。
欲将心事付瑶琴。
知音少,弦断有谁听。
f = open('小重山','r',encoding='utf-8') data = f.read() print(data) f.close()
小结:
open 指打开同一目录下的文本文件
文件在 py3中是以 utf-8保存的,Windows系统中的默认编码是 gbk ,需要在 f = open('小重山')中加入 encoding='utf-8' 即 f = open('小重山',encoding='utf-8' )
文件的操作对象及为文件的句柄,本质上是文件对象,如: f = open('小重山','r',encoding='utf-8'),只有有句柄,才可以对文件进行操作
文件操作具体方法
基本操作 r (只可读) w (只可写) a (追加)
read
read括号内数字的含义
f = open('小重山','r',encoding='utf-8') data = f.read(5) #指5个字符 print(data) f.close()
wirte
write在小重山文本成功写入hello world ,但是清空小重山文本之前的内容;
清空的动作从第一行的 "w" 开始的,如果没有对应文件会自动创建文件,有文件会自动清空文件,从第一个字符开始写。
f = open('小重山','w',encoding='utf-8') f.write('hello world') f.close()
write连续写两次,输出结果顺序排列,无换行,无空格
f = open('小重山2','w',encoding='utf-8') f.write('hello world') #如需换行,需加 f.write('Chung') f.close() #hello worldChung
append
在原文件的基础上进行写入,是从光标的后面开始
f = open('小重山','a',encoding='utf-8') f.write(' hello world ') #如需换行,需加 f.write('Chung') f.close() # hello world # Chung
扩展操作
readline
读取一整行,包括换行符
f = open('小重山','r',encoding='utf-8') print(f.readline()) #打印一行,包括默认隐藏的换行符 print(f.readline()) #到这共打印两行,包括默认隐藏的换行符 f.close() #昨夜寒蛩不住鸣。 #惊回千里梦,已三更。
readlines(不用readlines读文件,用 f )
读取整篇文章
f = open('小重山','r',encoding='utf-8') print(f.readlines()) #默认打印所有行,字符串放在列表中 #['昨夜寒蛩不住鸣。 ', '惊回千里梦,已三更。 ', '起来独自绕阶行。 ', '人悄悄,帘外月胧明。 ', '白首为功名,旧山松竹老,阻归程。 ', '欲将心事付瑶琴。 ', '知音少,弦断有谁听。'] f.close()
通过readlines打印整篇文章
f = open('小重山','r',encoding='utf-8') for i in f.readlines(): print(i.strip()) #打印整篇文章,因为print自带换行,所有函数strip消除变量i即readlines读取的换行符 f.close()
通过readlines在指定语句后面加入句子
f = open('小重山','r',encoding='utf-8') data=f.readlines()#注意及时关闭文件,只打开一次,节省时间 f.close() number = 0 for i in data: number += 1 if number == 6: i = ''.join([i.strip(), 'I like it.']) # 取代万恶的+ print(i.strip()) f.close()
f 即用即取,节省内存(用此方法读取文件)
1 ##########对于大数据文件,要用以下方式(the best way): 2 f = open('小重山','r',encoding='utf-8') 3 number=0 4 for i in f: #这是for内部将f对象做成一个迭代器,用一行取一行。 5 number+=1 6 if number == 6: 7 i = ''.join([i.strip(), 'I like it.']) # 取代万恶的+ 8 print(i.strip())
tell、seek
tell 表示当前光标的位置
seek 表示移动光标到指定位置
f = open('小重山','r',encoding='utf-8') print(f.tell())# 取出光标位置 #tell识别中文时默认一个字占3个字符,英文时一个字母占一个字符 print(f.read(2)) print(f.tell()) f.seek(0)# 移动光标到指定的位置 print(f.read(4))
文件操作之flush及遍历文件最优法
flush实际应用
#flush():同步将数据从缓存转移到磁盘上去 #实例:可用作进度条 import sys,time for i in range(30): sys.stdout.write("*") sys.stdout.flush() time.sleep(0.1)
print 的 flush
#print的flush import sys,time for i in range(30): print('*',end='',flush=True) time.sleep(0.1)
truncate:截断
f=open('小重山2','w',encoding='utf8') #truncate():截断数据(不能在r模式下) #在w模式下:先清空,再写,再截断 #在a模式下:直接将指定位置后的内容截断 f.truncate(5) f.write('hello world') f.truncate(5) f.close()
r+, w+, a+
- r+:(读写模式)光标默认在0位置,最后位置开始写
- w+:(写读模式)先清空,再写读
- a+:(从最后的位置开始读)光标默认在最后位置
f=open('小重山','r+',encoding='utf8') print(f.tell()) #当前光标位置为0 print(f.readline()) #昨夜寒蛩不住鸣。 f.write('岳飞') #《小重山》文件末尾处出现“岳飞”字样 print(f.tell()) #当前光标位置为228 f.seek(0) #制定光标移动到0 print(f.readline()) #昨夜寒蛩不住鸣。 f.close()
文件操作之修改磁盘文件
常规思路(无法实现)
由于磁盘存储机制不能完成
f=open('小重山','r+',encoding='utf8') number=0 for line in f: number+=1 if number==3: f.write('Chung') #此方法只能从文章末尾处开始添加
只能采取重新创建一个文件的思路
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 ']) #在句子后面继续添加字符 # line='hello 岳飞 ' #插入一行文字 f_write.write(line) f_read.close() f_write.close()
文件操作之with方法
省略主动关闭文件操作
with open('log','r') as f: pass
f=open('小重山', 'r') #为保证数据储存不失误,需要输入f.close来结束 f.readline() f.read() f.close() with open('小重山', 'r') as f: #无需输入f.close,数据可直接正常储存 f.readline() f.read() print('hello')
同时管理多个文件对象
with open('log1') as obj1, open('log2') as obj2: pass
with open('小重山','r',encoding='utf8') as f_read, open('小重山2','w',encoding='utf8') as f_write: for line in f_read: f_write.write(line)