一、文件读写基本操作1、文件操作的工作流程文件在我们的计算机上随处可见当我们需要永久保存数据的时候就会用到文件文件是由计算机操作系统来提供的那么自然也就受操作系统的控制。如下图所示一套完整的计算机系统主要由三部分构成1.应用程序2.操作系统3.计算机底层硬件如果应用程序需要操作硬件必须先要发指令给操作系统通过操作系统来帮应用程序完成对机器硬件的操作。如果应用程序需要把自己产生的数据永久保存起来应用程序产生的数据原本是在内存中那么就是把它写入硬盘这时应用程序要通过操作系统提供的接口来控制硬件如果应用程序需要读取文件内作容同样是向操作系统发起请求最后由操作系统返回文件内容这之间的过程如下图所示接下来我们要讲解的就是应用程序如何调用操作系统提供的接口来读取和写入文件。2、文件操作的基本形式我们事先在当前路径下准备好一个文件a.txt如下图所示接下来我们在文件处理.py文件内开始打开读取文件的操作在Python中必然会有一个功能或者接口来打开文件这个接口就是open使用参数如下图所示文件读取操作代码实例如下 open打开文件需要3个参数 打开文件之后会有一个返回值 读写操作就是对这个返回值进行操作 f open(文件的路径,mode打开文件的模式,encoding操作文件的字符编码) open是向操作系统发请求会占用操作系统资源这个资源不会自动回收 返回值就是应用程序拿到的变量应用程序的变量Python解释器会自动帮你回收 #1打开文件 f open(ra.txt,moder,encodingutf-8) #关于open函数中的mode参数可参见二.2 对于应用程序来说上面这行代码与我写一个f 1没有本质区别 你不需要再执行delf因为解释器会自动帮你清理这个应用程序资源 但是打开的文件占用了操作系统的资源这不会自动回收所以必须人为显式的进行回收 f.close即可注意其中delf一定要发生在f.close之后否则就会导致操作系统打开的文件还没有关闭 白白占用资源 #2读取文件 data f.read () print(data) #3关闭文件清理操作系统打开文件的资源 f.close() print (f) #应用程序的资源还在 # f.read () #文件关闭不能再进行读取打开一个文件其实是占用了两部分资源分别是操作系统资源和应用程序资源应用程序资源会自动由Python解释器来回收而操作系统打开文件的资源并不会立即回收操作系统每打开一个文件其实会有一个编号每个编号与应用程序向操作系统发起文件操作请求的编号一一对应这个编号称为文件描述符操作系统的文件描述符编号是有限的所以当服务器高并发的时候由于打开文件个数非常多因而还没来得及关闭那么服务器就卡了返回给用的的结果就是用户的客户端卡了。有的时候关闭文件的操作总是会被遗忘我们有一个使用with来操作文件的方式它是一个上下文的操作会帮你自动的关闭文件代码示例如下#as指的是赋值 with open(a.txt, r, encodingutf-8) as f: data f .read() print(data)除此之外“with”可以连续打开多个文件代码示例如下with open(a1.txt, r, encodingutf-8) as f1, \ open(a2.txt, r, encodingutf-8) as f2: data1 fl.read() data2 f2.read()二、默认打开文件的参数说明1、文件打开的字符编码如果不指定字符编码默认打开文件的字符编码与操作系统相匹配Windows系统中国大陆用户gbkLiunx系统utf-8MacOS:utf-8在不指定字符编码的情况下MacOS系统示例代码#文件保存的以utf-8编码保存与本机默认编码一致 with open(a.txt, r, ) as f: data f.read() print(data)2、文件的打开模式文件默认的打开模式是“t”模式指的是文本模式这意味着在该模式下无法打开图片视频和音频等文件因为这些是以二进制格式存储的文本模式是以字符形式存储的。操作文件的模式有三种分别是“r”“w”和“a”模式“r”是只读“w”是只写“a”是指追加默认操作文件大模式是“r”模式所以默认文件的打开模式是“rt”模式对于操作文本文件“”模式必须与操作文件的三种模式连用很多时候你看到的这个“t”经常会省略不写这是可以的。三、文本模式打开文件的操作在文件处理中我们需要打开一个文件打开文件有若干种方式有时我们只希望读取文件内容而不想修改那么为了防止失误性的修改文件可使用r模式打开文件这样你就不能对文件进行任何修改啦每一种模式都有其存在的意义大家用多了就明白了。1、操作文件“r”模式全部读取使用read代码示例如下f open(a.txt, moder, encodingutf-8) #r模式下如果文件不存在会报错 #f.write(哈哈) #抛出异常不能写 print(f.readable()) #判断是否可读 print(1) print(f.read()) #全部读取 print(2) # 读文件会有一个光标移动第一次读完了光标移至末尾第二次读无内容 print(f.read()) f.close()一行一行读文件内容使用readline代码示例如下f open(a.txt moder encodingutf-8) # readline指的是一行一行读文件 print(f.readline(), end) #文件中有换行print也自带换行指定end参数去掉默认换行 print(f.readline(), end) print(f.readline(), end) f.close()全部读取文件内容存入列表每行内容为列表的一个元素使用readlines代码示例如下f open(a.txt, moder, encodingutf-8) print(f.readlines()) f.close()readlines可以加数字作为参数但是他不是指的行数而是字节数所以我们一般不用如需逐行打印文件内容常用readlines与for循环连用代码示例如下#如果文件内容比较少的时候以下两种方式都可以 with open(a.txt) as f: #当文件很大时f.readlines()结果是一个很大的列表在内存中机器就卡了 for line in f.readlines(): print(line, end) #推荐使用这种方式 with open(a.txtas f #f是一个可迭代对象就像老母鸡会下蛋一样 for line in f: #文件内容很大时使用这种方式每次内存中只有一行内容 print line, end)2、操作文件“w”模注意在“w”只写模式下当文件存在时就会清空该文件代码示例如下f open(ra.txt, modew, encodingutf-8) # 默认是wt f.write(第一行\n) #需要自己添加\n来换行 f.write(第二行\n) f.close()当文件不存在时就会创建空文档代码示例如下f open(ra1.txt, modew, encodingutf-8) #默认是wt f.write(第一行\n) f.write(第二行\n) f.close()只写模式常用的方法f open(ral.txt, modew, encodingutf-8) #默认是wt f.writable() #writelines指的是可以放一个列表或者元组里面可以有多行内容需要自己加换行符 f.writelines([111111\n, 222222\n, 333333\n]) #下面这样代码与上面写的结果一样 # f.write(aaaaaa\nbbbbbbb\ncccccc\n) f.close()3、操作文件“a”模式“a”模式指的是只追加写当文件不存在时创建空文件当文件存在时光标直接移至文件末尾所以我们在记录日志的时候都会使用“a”模式代码示例如下f open(access.log modea encodingutf-8) print(f.writable()) print (f.readable()) f.write(5555555555555\n) f.close()四、二进制模式打开文件的操作1、“b”模式基本介绍“b”模式指的是文件打开的模式为“b”模式它与“t”模式类似不能单独使用必须以“rb”“wb”或者“ab”模式来使用“b”模式读写都是以bytes为单位进行的所以可以理解为“b”模式就是二进制模式。对于普通文本来说是以字符的形式保存的但是对于图片视频或者音频等等这些文件则是以二进制形式保存的所以“t”模式无法读取代码及报错示例如下图片文件并不是以字符编码保存的而是以JPG这个格式保存成了二进制形式与字符编码没有关系所以我们以文本模式处理文件是不可行的。应该以二进制模式打开文件这时不需要指定字符编码正确的打开方式请看如下代码示例#b模式下一定不能指定encoding参数 with open(o1.jpg, rb, ) as f: data f.read() print(data)强调:1、与t模式类似不能单独使用必须是rbwbab2、b模式下读写都是以bytes单位的3、b模式下一定不能指定encoding参数不指定encoding参数默认为二进制4、b模式二进制可以读取文字图片视频什么文件都可以因为所有类型的数据都要以二进制形式存在硬盘中)2、操作文件的“rb”模式需要说明的一点是“b”模式也可以读取文本文件字符的底层都是以二进制形式存储的只不过你在使用“t”模式读取文本文件的时候open帮你把二进制转成了能够看懂的文本这是“t”模式的便利之处但是它有局限性只能操作文本文件而“b”模式具有统一性任何文件底层存储原理都是二进制这也就是意味着“b”模式可以操作任何文件代码示例如下with open(01.jpg, rb, ) as f1, open(a.txt, rb) as f2: img f1.read() text f2.read() print(text.decode(utf-8)) #把bytes转化成utf-83、操作文件的“wb”模式“wb”模式也是操作文件“w”模式的一种当文件存在时就会清空该文件当文件不存在时就会创建空文件比如当你需要对一个文档重写时就会用到。代码示例如下#wb模式写入 with open(a.txt, wb) as f: msg 你好世界 f.write(msg.encode(utf-8)) #指定写入文件的字符编码 #rb模式读取 with open(a.txt, rb) as f: data f.read() print(data) print(type(data)) print(data.decode(utf-8)) #指定读取文件的字符编码4、操作文件的“ab”模式“ab”模式指的是以二进制形式追加写与操作文件的“a”模式同理代码示例如下with open(a.txt, ab) as f: msg \n世界你也好, 小鬼 f.write(msg.encode(utf-8)) #指定写入文件的字符编码补充:在这这里讲一个小模块的部分用法是sys模块它的使用说明请看下面代码示例和截图import SYS # 首先导入这个模块 list test sys.argv # 它的返回值是一个列表 print(list_test)注小模块是python大牛已经写好的轮子里面可能有你在特定场景下需要的一些功能性函数你就不需要自己写函数啦调它的库再调它的函数就完事啦~接下来我们在终端环境下执行以下命令注意参数1前后的空格你可以看到在终端执行打印的结果就是一个列表第一个值是文件路径第二个和第三个值分别是两个参数。5、操作文件的其他模式了解一般来说你遇到的操作文件的模式都是只读或者只写但是也有可读可写的模式这类模式了解即可说明和代码示例如下#“rt模式或者写成r模式指的是可读可写 with open(a.txt, rt, encodingutf-8) as f: print(f.readable()) print(f.writable()) # wr或者w模式可读可写 with open(a.txt, wt, encodingutf-8) as f: print(f.readable()) print(f.writable()) #at或者a可读可追加写 with open(a.txt, at, encodingutf-8) as f: print(f.readable()) print(f.writable()) #u模式通用换行符已废弃无需了解 # with open(a.txt, U, encodingutf-8) as f: # print(f.readable()) # print(f.writable())“r”与“w”“a”模式都是可读可写他们的区别在于不改变自身原本操作文件的形式即“r”模式下当文件不存在会报错“w”或者“a”模式当件不存在会创建新件当件存在时w会清空文件a会在写入时追加内容。五、文件内光标移动在打开文件时会有一个光标移动我们使用seek这个方法可以实现光标的移动代码示例如下with open(a.txt, r ) as f f.seek(9) #这个参数指的是偏移量以字节为单位 data f.read() print(data)注意光标移动只能是从左往右移动seek可以加两个参数第一个参数就是上面代码中的参数你如果只传一个参数也就是指的这个参数第二个参数默认是0指的是光标在文件开头位置开始移动除了0之外只能接收1或者2作为参数1表示从当前位置开始移动2表示从文件末尾开始移动其中1和2必须在“b”模式下进行0可以在“t”模式或者“b”下都能运行但是无论哪种模式都是以bytes为单位进行的代码示例如下with open(a.txt, rb) as f: f.seek(3, 0) # 移动三个字节也就是utf-8编码下一个中文字符 print(f.tell()) #当前光标位置以字节为单位 f.seek(3, 1) #从当前位置向右偏移3个字节然后再读取文件内容 #f.seek(3, 2) #只能读取动态数据新添加的内容 data f.read() print(data.decode(utf-8)) with open(a.txt, r) as f: f.seek(3, 0) print(f.read())补充:在这里补充一个小模块的用法是os模块它的使用说明请看下面代码示例import os #首先导入这个模块 os.rename(a.txt, b.txt) #修改文件名两个参数分别为源文件名和目标文件名 os.remove(a1.txt #删除a1.txt文件这个参数指的是文件路径