读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
文件读写的3种模式
1、w —— 写模式,它是不能读的,如果用w模式打开一个已经存在的文件,会直接覆盖(相当于删掉后新写入一个文件)。 2、r —— 读模式,只能读,不能写,而且文件必须存在 3、a —— 追加模式,在文件的末尾添加内容 4、rb、wb、ab —— 以二进制模式读取、写入、追加,常用于图片、音频、视频等文件
1、写文件
#以写文件的模式打开一个文件对象,使用Python内置的open()函数,如果文件已存在,会直接覆盖(相当于删掉后新写入一个文件)。
f = open('test.txt', 'w') #文件名可写相对路径,也可写绝对路径;test.txt(相对路径):在当前文件下创建了test.txt
f.write('Hello, world!')
f.close()
你可以反复调用 write()
来写入文件,但是必须要调用 f.close()
来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用 close()
方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用 close()
的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with
语句保险:
#向1.txt文件中写入文本
with open("1.txt","w",encoding="utf-8") as f: #指定编码utf-8编写,空间大
f.write("123\n")
f.write("I LOVE YOU\n")
f.write("中国人")
2、读文件
#以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符如果文件不存在,会报错
f = open('/Users/michael/test.txt', 'r')
#文件打开成功,调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示
f.read('Hello, world!')
#调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的
f.close()
每次都这么写实在太繁琐,所以,Python引入了 with
语句来自动帮我们调用 close()
方法。这样代码更佳简洁,并且不必调用f.close()
方法。
with open('1.txt','r') as f:
f.read()
python文件对象提供了三个 "读" 方法: read()、readline() 和 readlines()。每种方法可以接受一个变量以限制每次读取的数据量。
- read() 一次性读取文件的全部内容,它通常用于将文件内容放到一个字符串变量中。如果文件太大,内存就爆了,所以,为了保险起见,可以反复调用
read(size)
方法,每次最多读取 size 个字节的内容。 - readline() 每次读取一行内容,通常比readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 readline()。
- readlines() 一次读取整个文件,像 read() 一样,之后,readlines() 自动将文件内容按行返回一个列表(list)。
如果文件很小,read()
一次性读取最方便;如果不能确定文件大小,反复调用 read(size)
比较保险;如果是配置文件(用户登录电脑时,或是用户在使用软件时,软件系统为用户所要加载所需环境的设置和文件的集合。),调用 readlines()
最方便。
#read()方式读取文件--一次性读取文件的全部内容
with open("1.txt",encoding="utf-8") as f:
txt=f.read()
print(txt)
print(type(txt))
运行结果:
123
I LOVE YOU
中国人
<class 'str'>
#read(size)方式读取文件--每次最多读取size个字节的内容
with open("1.txt",encoding="utf-8") as f:
txt=f.read(12)
print(txt)
t2=f.read() #读完上一次未读的字节
print(t2)
运行结果:
123
I LOVE Y
OU
中国人
#readline()方式读取文件--每次读取一行;默认换行
with open("1.txt",encoding="utf-8") as f:
while 1:
txt=f.readline()
if txt:
print(txt,end="") #end="",因为readline()默认换行,冲突
else:
break
print(type(txt))
运行结果:
中国人
123
I LOVE YOU
中国人<class 'str'>
#readlines()方式读取文件--一次读取所有内容,并按行返回一个列表
with open("1.txt",encoding="utf-8") as f:
txt=f.readlines()
print(txt)
print(type(txt))
运行结果:
['123\n', 'I LOVE YOU\n', '中国人']
<class 'list'>
3、读写二进制文件
图片、音频、视频等需要以二进制的格式进行读写。
3.1 读二进制文件
with open("1.jpg","rb") as f:
all=f.read() #读取1.jpg的全部字节,为 写二进制文件 做准备;由于信息量太大,故没有print
t=f.read(3) #只读取前三个字节
print(t)
print(type(t))
运行结果:
b'\xff\xd8\xff'
<class 'bytes'>
3.2 写二进制文件
with open("2.jpg","wb") as f:
f.write(all) #复制一张1.jpg,命名为2.jpg
3.3 先读再写 -- 复制
#将当前目录下的1.jpg复制一份,并命名为2.jpg
with open("1.jpg","rb") as f:
all=f.read() #读取1.jpg的全部字节
with open("2.jpg","wb") as f:
f.write(all)
3.4 边读边写 -- 复制
#将当前目录下的Java01-1.mp4复制一份,并命名为Java.mp4
with open("Java01-1.mp4","rb") as f:
while 1:
txt=f.read(2000) #由于视频太大,所以进行多次读取,每次读取2000个字节
if txt:
with open("Java.mp4","ab") as f1: #将读取的字节以'追加'的方式保存到 Java.mp4 文件中
f1.write(txt)
else:
break
4、字符编码
要读取非UTF-8编码的文本文件,需要给open()
函数传入encoding
参数,例如,读取GBK编码的文件:
with open("test.txt","r",encoding='gbk') as f:
t=f.read()