一、文件操作的基本流程
计算机系统分为:计算机硬件,操作系统,应用程序三部分。
我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。
有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程。
操作一个文件首先思考都需要哪些参数:
- 文件所在的路径,如:d:\test.txt
- 读取文件所使用的编码
- 操作方式:读、写、追加...
- 关闭文件,释放资源
读取d:\test.txt文件,保存格式utf-8:
#在Python中,我们通过open()获得一个文件句柄,然后我们利用文件句柄实现对文件的操作 f = open(‘d:\\test.txt‘,encoding=‘utf-8‘,mode=‘r‘) content = f.read() #读取文件内容 f.close() print(content)
二、文件编码
f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
#这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。 f=open(‘a.txt‘,‘r‘,encoding=‘utf-8‘)
三、文件打开模式
文件句柄 = open(文件路径,操作方式,编码)
‘‘‘ 1.对于文本文件的读取: r:只读模式 w:只写模式 a:追加模式 2.对于非文本文件的读取: rb:以二进制只读模式 wb:以二进制只写模式 ab:以二进制追加模式 3.+ 就是代表了功能增强 r+:以读写的模式打开 w+:以读写模式打开 a+:以读写模式打开 4.以bytes类型操作的模式 rb+/r+b 以二进制读写模式打开 wb+/w+b 以二进制读写模式打开 ab+/a+b 以二进制读写模式打开 ‘‘‘
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
四、文件操作方法
4.1常用操作方法
1 #1.read() 整体读取出来 2 f = open(‘d:\\test.txt‘,encoding=‘utf-8‘)#r可以省略 3 content = f.read() 4 print(content) 5 6 #2.readline()读取一行 7 f = open(‘d:\\test.txt‘,encoding=‘utf-8‘) 8 line1 = f.readline() #一次只读取一行内容 9 line2 = f.readline() 10 print(line1) 11 print(line2) 12 13 14 #3.readlines() 读取,把每一行作为列表元素,返回一个列表 15 li = [] 16 f = open(‘d:\\test.txt‘,encoding=‘utf-8‘) 17 li = f.readlines() 18 print(li)#[‘This is a file.\n‘, ‘Python3 file Operate method.\n‘] 19 20 #4.readable() 21 f = open(‘d:\\test.txt‘,encoding=‘utf-8‘) 22 l = f.readable() #是否可读 23 print(l) 24 25 #5.读取大文件,如果一个文件为16G,远远超过了我们普通电脑的内存大小,怎么读 26 f = open(‘d:\\test.txt‘,encoding=‘utf-8‘) 27 for i in f: #文件句柄,一行一行的读 28 print(i) 29 30 #6.读取n个字符, 在rb模式下,按照字节读 31 f = open(‘d:\\test.txt‘,encoding=‘utf-8‘,mode=‘r‘) 32 content = f.read(3) 33 print(content) #Thi 中华人 34 35 # rb 模式下 不用 encoding=‘UTF-8‘ 36 f = open(‘d:\\test.txt‘,mode=‘rb‘) 37 content = f.read(3) 38 print(content) #b‘\xe4\xb8\xad‘ 39 print(b‘\xe4\xb8\xad‘.decode(‘utf-8‘)) #中
4.2只写操作
1 f = open(‘d:\\test.txt‘,mode=‘w‘,encoding=‘utf-8‘) 2 if f.writable(): #判断文件是否可写 3 f.write(‘新内容‘) #如果文件存在,把原内容覆盖;如果文件不存在,创建文件,写入内容 4 if f.readable(): #不可以读,所以无打印 5 print(f.read())
4.3追加操作
1 f = open(‘d:\\test.txt‘,mode=‘a‘,encoding=‘utf-8‘) 2 if f.writable():#判断是否可写 3 f.write("追加的内容") #如果文件存在,在原内容后追加;如果文件不存在,创建文件,写入内容 4 if f.readable():#判断是否可读 ,不可读 5 f.read(f.read())
五、光标移动
seek()、tell()、truncate()光标移动都是以字节为单位的。
1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的 2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果。
seek()
seek() 方法用于移动指针(文件读取指针)到指定位置。
tell()
truncate()