1.文件操作
使用python来读写文件是非常简单的的操作,我们使用open()函数来打开一个文件,获取到文件句柄,然后通过文件家居并就可以进行各种各样的操作了。根据打开方式的不同能够执行的操作也有相应的差异。
打开的 方式:r,w,a,r+,w+,a+,rb,wb,ab,r+b,w+b,ab.默认使用的是r(只读)模式
2.只读操作(r,rb)
1 f = open("a.txt",mode = "r",encoding = "utf-8") 2 content = f.read() 3 print(content) 4 f.close()
encoding表示编码集,更多使用utf-8
rb读取出来的数据是bytes类型,在rb模式下,不能选择encoding字符集
1 f = open("a.txt",mode = "rb") 2 content = f.read() 3 print(content) 4 f.close
rb的作用:在读取非文本文件的时候,比如读取MP3,图像,视频等信息的时候就需要用到rb,因为这种数据是没办法直接显示出来的,在后面我们文件上传下载的时候还会用到,还有看的直播,都是这种数据。
绝对路径和相对路径:
1.绝对路径:从磁盘根目录开始一直到文件名
2.相对路径:同一个文件夹下的文件,相对于当前这个程序所在的文件夹而言,如果在同一个文件夹中,则相对路径就是这个文件名,如果在上一层文件夹,则要加../
推荐使用相对路径,因为在把程序拷贝给别人使用的时候,直接把项目拷贝走就能运行,但是如果使用绝对路径,还需要拷贝外部的文件。
读取文件的方法:
read()将文件中的内容全部读取出来,弊端:占内存,如果文件过大,容易导致内存崩溃
1 f = open("a.txt",mode = "r",encoding = "utf-8") 2 content = f.read() 3 print(content)
read(n)读取n个字符,需要注意的是,如果再次读取,那么会在当前位置继续去读而不是从头去读,如果使用的是rb模式,则读取出来的是n个字节
1 f = open("a.txt",mode = "r",encoding = "utf-8") 2 content1 = f.read(3) 3 content2 = f.read(3) 4 print(content1) 5 print(content2)
readline()一次读取一行数据,注意:readline()结尾,注意每次读取出来的数据都会有一个 ,所以需要使用strip()方法来去掉 或者空格
1 f = open("a.txt",mode = "r",encoding="utf-8") 2 content1 = f.readline() 3 content2 = f.readline() 4 content3 = f.readline() 5 content4 = f.readline() 6 print(content1) 7 print(content2) 8 print(content3) 9 print(content4) 10 f.close
readlines()将每一行形成一个元素,放到一个列表中。将所有的内容都读取出来,所哟也是容易出现内存崩溃的问题,不推荐使用。
1 f = open("a.txt",mode = "r",encoding = "utf-8") 2 lst = f.readlines() 3 print(lst) 4 for line in lst: 5 print(line.strip())
循环读取。这种方式是最好的,每次读取一行,不会产生内存溢出的问题
1 f = open("a.txt",mode = "r",encoding = "utf-8") 2 for line in f: 3 print(line.strip())
读取完的文件句柄一定要关闭 f.close()
3.写模式(w,wb)
写的时候,如果没有文件,则会创建文件,如果文件存在,则将原文件中原来的内容删除,再写入新的内容
1 f = open("a.txt",mode = "w",encoding="utf-8") 2 f.write("123") 3 f.flush() 4 f,close()
wb模式下,可以不指定打开文件的编码,但是在写文件的时候必须将字符串转化成utf-8的bytes数据
4.追加(a,ab)
在追加模式下,写入的内容会追加在文件的结尾
5.读写模式(r+,r+b)
对于读写模式,必须是先读,因为默认光标是在开头准备读取的,当读完了之后再进行写入
1 f = open("a.txt",mode = "r+",encoding = "utf-8") 2 cotent = f.read() 3 f.write("123") 4 print(content) 5 f.flush() 6 f.close()
必须在读取之后再写
6.写读模式(w+,w+b)
先将所有内容清空,然后写入,最后读取,但是读取的内容是空的,不常用
7.追加读(a+)
a+模式下,不论是先读还是后读,都是读取不到数据的.
8.其他相关操作
1.seek(n) 光标移动到n位置,移动的单位是byte,所有如果是utf-8的中文部分要是3的倍数
移动到开头:seek(0)
移动到结尾:seek(0,2) seek的第二个参数表示的是从哪个位置进行偏移,默认是0,表示开头,1表示当前位置,2表示结尾
2.tell() 使用tell()可以帮我们获取到当前光标在什么位置
3.truncate() 截断文件
在r+模式下,如果读取了内容,不论读取多少,光标显示的是多少,再写入或者操作文件的时候都是在结尾进行的操作。
如果想做截断操作,要先挪动光标到想截断的位置,然后再进行截断
如果truncate(n) 给出了n,则从开头进行截断,如果不给n,则从当前位置截断,后面的内容将会被删除
4. 修改文件以及另一种打开文件的方式
文件修改:只能将文件中的内容读取到内存中,将信息修改完毕,然后将源文件删除,将新的文件的名字改成老文件的名字
1 import os 2 3 with open("a.txt",mode = "r",encoding = "utf-8") as f1, 4 open("a1.txt",mode = "w",encoding = "utf-8") as f2: 5 content = f1.read() 6 content1 = content1.replace("456","123") 7 f2.write(content1) 8 os.remove("a.txt") 9 os.rename("a1.txt","a.txt")
一次将所有的内存读取,内存溢出
解决方案:一行一行的读取和操作