文件操作基本流程
- 打开文件,得到文件句柄并赋值给一个变量;
- 通过句柄对文件进行操作
- 关闭文件
现有文件如下:
1 昨夜寒蛩不住鸣。 2 惊回千里梦,已三更。 3 起来独自绕阶行。 4 人悄悄,帘外月胧明。 5 白首为功名,旧山松竹老,阻归程。 6 欲将心事付瑶琴。 7 知音少,弦断有谁听。
对上述文件进行操作:
1 f = open(‘小重山‘,‘r‘,encoding=‘utf8‘) #打开文件,读模式 2 data=f.read()#获取文件内容
3 print(data)
4 f.close() #关闭文件
注意 if in the win,小重山文件是utf8保存的,打开文件时open函数是通过操作系统打开的文件,而win操作系统默认的是gbk编码,所以直接打开会乱码,需要f=open(‘小重山‘,encoding=‘utf8‘)。
文件打开模式
1 ========= =============================================================== 2 Character Meaning 3 --------- --------------------------------------------------------------- 4 ‘r‘ open for reading (default) 5 ‘w‘ open for writing, truncating the file first #文件如果不存在就会创建一个文件;创建文件对象时就会将文件中的内容清空。 6 ‘x‘ create a new file and open it for writing 7 ‘a‘ open for writing, appending to the end of the file if it exists 8 ‘b‘ binary mode 9 ‘t‘ text mode (default) 10 ‘+‘ open a disk file for updating (reading and writing) 11 ‘U‘ universal newline mode (deprecated)
12 ‘r+‘ 读写模式
13 ‘w+‘ 写读模式
14 ‘a+‘ 追加读模式 15 ========= ===============================================================
r+:读是从0位置开始读,写是在文件最后位置写
1 f=open(‘小重山‘,‘r+‘,encoding=‘utf8‘) 2 f.write(‘岳飞‘) 3 f.close() 4 输出: 5 昨夜寒蛩不住鸣。 6 惊回千里梦,已三更。 7 起来独自绕阶行。 8 人悄悄,帘外月胧明。 9 白首为功名,旧山松竹老,阻归程。 10 欲将心事付瑶琴。 11 知音少,弦断有谁听。岳飞
w+:先清空文件,再写读,读写是从下例岳飞之后开始读写
1 f=open(‘小重山‘,‘w+‘,encoding=‘utf8‘) 2 print(f.readline()) 3 f.write(‘岳飞‘) 4 print(f.readline()) 5 f.close() 6 输出: 7 昨夜寒蛩不住鸣。 8 惊回千里梦,已三更。 9 起来独自绕阶行。 10 人悄悄,帘外月胧明。 11 白首为功名,旧山松竹老,阻归程。 12 欲将心事付瑶琴。 13 知音少,弦断有谁听。 14 ------------------------------------------ 15 岳飞
1 f=open(‘小重山‘,‘r+‘,encoding=‘utf8‘) 2 print(f.tell()) #查看此时光标的位置 3 print(f.readline()) 4 f.write(‘岳飞‘) 5 print(f.tell()) #查看write之后光标的位置 6 f.seek(0) #将光标移动到0的位置,为了能够查看文件中的内容 7 print(f.readline()) 8 f.close()
a+:光标默认在最后的位置。即写在文件最后开始写,读在文件最后开始读。
先介绍三种最基本的模式:
1 # f = open(‘小重山2‘,‘w‘) #打开文件 2 # f = open(‘小重山2‘,‘a‘) #打开文件 3 # f.write(‘莫等闲1\\n‘) 4 # f.write(‘白了少年头2\\n‘) 5 # f.write(‘空悲切!3‘)
6 # f.close() #文件关闭之前统一将内容写入磁盘
文件操作方法
1.readline():
2.readlines():
输出:
[‘昨夜寒蛩不住鸣。\\n‘, ‘惊回千里梦,已三更。\\n‘, ‘起来独自绕阶行。\\n‘, ‘人悄悄,帘外月胧明。\\n‘, ‘白首为功名,旧山松竹老,阻归程。
3.一行一行的读取文件的内容
1 f = open(‘小重山‘,‘r‘,encoding=‘utf8‘) 2 for i in f.readlines(): 3 print(i.strip()) 4 5 输出: 6 昨夜寒蛩不住鸣。 7 惊回千里梦,已三更。 8 起来独自绕阶行。 9 人悄悄,帘外月胧明。 10 白首为功名,旧山松竹老,阻归程。 11 欲将心事付瑶琴。 12 知音少,弦断有谁听。
4.在第6行添加iiiii:
1 f = open(‘小重山‘,‘r‘,encoding=‘utf8‘)
2 data=f.readlines()
3 f.close()
4 number=0
5 for i in data:
6 number+=1
7 if number == 6
8 i = ‘‘.join([i.strip(), ‘iiiii‘]) # 取代万恶的+
9 print(i.strip())
优化:
1 ##########对于大数据文件,要用以下方式(the best way):
2 f = open(‘小重山‘,‘r‘,encoding=‘utf8‘)
3 number=0 4 for i in f:#这是for内部将f对象做成一个迭代器,用一行去一行。 5 number+=1 6 if number == 6: 7 i = ‘‘.join([i.strip(), ‘iiiii‘]) 8 print(i.strip())
5.tell :取出光标的位置
1 f=open(‘小重山‘,‘a‘,encoding=‘utf8‘) 2 print(f.tell())# 取出光标位置,英文一个字符,中文3个字符(前提是使用utf8编码) 3 print(f.read(2)) #read,无论是中文还是英文都是一个字符 4 print(f.tell())
6.seek:移动光标到指定的位置;作用:比如断点续传
1 f=open(‘小重山2‘,‘r‘,encoding=‘utf8‘) 2 f.seek(0) 3 print(f.read(4))
7.flush:write是在文件关闭之前统一将内存中的数据写入磁盘,对于安全性要求高的,flush就有用途了,即立刻将内存中的数据写入磁盘,无需等到文件关闭。
进度条例子:
1 import sys,time 2 for i in range(30): 3 sys.stdout.write("*") #sys.stdout 终端输出对象 4 sys.stdout.flush() 5 time.sleep(0.1)
如果没有使用flush,将会在循环结束后统一将30个*一次从终端输出
print的flush:
1 import sys,time 2 for i in range(30): 3 print(‘*‘,end=‘‘,flush=True) 4 time.sleep(0.1)
8.truncate:截断(即删除)数据(注意不能再r模式下)
1 #在w模式下:先清空文件,再写,再截断 2 #在a模式下:直接将指定位置后的内容截断 3 f=open(‘小重山‘,‘w‘,encoding=‘utf8‘) 4 f.write(‘hello world‘) 5 f.truncate(5) 6 f.close()
如何在磁盘修改文件:
常规思路:由于磁盘存储机制不能够实现
1 f=open(‘小重山‘,‘r+‘,encoding=‘utf8‘)
2 number=0 3 for line in f: 4 number+=1 5 if number==3: 6 f.write(‘alex‘)
r+:写都是在文件最后开始写
只能采取重新创建一个文件的思路:
1 f_read=open(‘小重山‘,‘r‘,encoding=‘utf8‘) 2 f_write = open(‘小重山2‘,‘w‘,encoding=‘utf8‘) 3 4 number=0 5 for line in f_read: 6 number+=1 7 if number==5: 8 line=‘‘.join([line.strip(),‘alex\\n‘]) 9 f_write.write(line) 10 11 f_read.close() 12 f_write.close()
文件操作之with操作:
为了避免打开文件后忘记关闭,可以通过管理上下文,即:
1 with open(‘log‘,‘r‘) as f: 2 pass
如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:
1 with open(‘log1‘) as obj1, open(‘log2‘) as obj2: 2 pass