文件相关操作
计算机系统分为:计算机硬件,操作系统,应用程序三部分。 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,应用程序是无法直接操作硬件的,这就用到了操作系统。
操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。
【注】
# 在同一个文件夹下(‘zhouyuan’这个文件与‘文件处理.py'文件在同一处)直接可以open加文件名。【】
#Windows操作系统是gbk编码,而pycharm是默认utf-8编码,open函数解锁当前操作系统的编码,gbk不能解码utf-8编码的文件。
#在文件夹中编写文件pycharm是自动保存的。
#对于文件是可以在建立文件是修改它的编码方式的,例如,在pycharm的右下角,默认的utf-8编码改成与Windows一致的gbk编码,就可以不用encoding='utf-8' 修改解码方式与pycharm一致了。
#什么是句柄?类比于应用程序无法直接去操作硬盘上的数据,此时操作系统需要提供一个句柄,并复制给一个变量。
文件句柄 = open('文件路径', '模式')
#关闭文件 f.close()
1 f=open('zhoutao',encoding='utf-8') 2 data=f.read() 3 print(data) 4 f.close()
#文件处理流程:
1 文件处理流程: 2 1.打开文件,得到文件句柄并赋值给一个变量 3 2. 通过句柄对文件进行操作 4 3. 关闭文件
#资源回收: 打开一个文件包含两部分资源:操作系统级打开的文件+应用程序的变量。在操作完毕一个文件时,必须把与该文件的这两部分资源一个不落地回收,回收方法为: 1、f.close() #回收操作系统级打开的文件 2、del f #回收应用程序级的变量 其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源, 而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,在操作完毕文件后,一定要记住f.close()
f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。 这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。 f=open('a.txt','r',encoding='utf-8')
【1】文件处理读操作 (read(),readline(),readable(),readlines())
1 f=open('zhoutao',‘r’) 2 # data=f.read() 3 # print(data) 4 print(f.readable()) #readable()是否可读,结果是True False 5 print(f.readline()) #readline()读取一行 6 print(f.readline()) 7 print(f.readline()) 8 f.close() 9 #结果:True 10 # 周涛 11 # zhou 12 # yuan 13 14 f=open('zhoutao') 15 data=f.read() 16 print(data) 17 print(f.readable()) 18 print(f.readline()) #最后游标已经到了最后一行,再readline已经没有结果 19 f.close() 20 #结果:周涛 21 # zhou 22 # yuan 23 # 涛 24 # True 25 26 f=open('zhoutao') 27 data=f.readlines() #readlines()每行作为一个字符串放入列表中 28 print(data) 29 f.close() 30 #结果:['周涛 ', 'zhou ', 'yuan ', '涛']
【2】文件处理写操作(write(),writelines())(标明是'w'写模式,如果原文件有内容则会清空原内容,如果原文件不存在则会自动新建一个文件)
1 f=open('zhouyuan','w',encoding='utf-8') 2 # f.read() 3 f.write('周圆最美 ') 4 f.write('周涛最丑 ') 5 f.writelines(['666 ','888 ','999 ']) #文件内容只能是字符串 6 f.close() 7 #结果:周圆最美 8 # 周涛最丑 9 # 666 10 # 888 11 # 999
【3】‘a’追加模式('a'直接追加到文件最后)
1 f=open('zhouyuan','a',encoding='utf-8') 2 f.write('写到文件最后') 3 #结果:周圆最美 4 # 周涛最丑 5 # 666 6 # 888 7 # 999 8 # 写到文件最后
【4】with使文件打开自动关闭
1 with open('zhouyuan','w') as f: 2 f.write('666 ') 3 #结果:将‘zhouyuan’里面的内容改成了‘666’
【5】文件的修改
文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式: 方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器) 方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
1 方法一: 2 import os 3 4 with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: 5 data=read_f.read() #全部读入内存,如果文件很大,会很卡 6 data=data.replace('alex','SB') #在内存中完成修改 7 8 write_f.write(data) #一次性写入新文件 9 10 os.remove('a.txt') 11 os.rename('.a.txt.swap','a.txt') 12 13 方法二: 14 import os 15 16 with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: 17 for line in read_f: 18 line=line.replace('alex','SB') 19 write_f.write(line) 20 21 os.remove('a.txt') 22 os.rename('.a.txt.swap','a.txt')
文件处理b模式
【b方式不能指定编码,b表示原生二进制字节形式】
1 f=open('zhouyuan','rb') 2 data=f.read() 3 #‘字符串------encode-------bytes’ 4 #bytes-------decode-------‘字符串’ 5 print(data) 6 print(data.decode('utf-8')) 7 #结果:b'666 ' #【b表示原生二进制字节形式】 8 # 666
1 f=open('zhouyuan','wb') 2 f.write(bytes('你好漂亮 ',encoding='utf-8')) #字符串以utf-8编码成字节 3 f.write('周圆'.encode('utf-8')) 4 #结果:你好漂亮 5 # 周圆
1 f=open('zhouyuan','ab') 2 f.write('小仙女'.encode('utf-8')) 3 #结果:你好漂亮 4 # 周圆小仙女
文件操作其他方法
1 f=open('a.txt','w',encoding=' gbk') 2 f.write('nihao') 3 print(f.closed) #判断文件是否关闭 4 print(f.encoding) #显示编码,显示打开的编码,与文件以什么编码存入无关 5 f.flush() #自动保存,从内存中到硬盘。不需要人工保存 6 print(f.tell()) #显示光标位置在哪 7 #结果:False 8 # gbk 9 # 5