python学习10
文件操作
文件,就是把一些数据存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力。
文件类型:
- 文本类型:以文字存储为主,读写均以“字符”为单位
- 二进制类型:以图形、声音、影像为存储内容的形式,读写均以”字节“为单位。
文件后缀:
- 文本类型:txt、py、doc、docx、pdf、csv、xls、xml、html……
- 二进制类型:jpg、png、MP3、wav、mp4、mov、avi……
后缀名主要是为了帮助操作系统识别文件类型,以选择合适的打开方式。
1. 文件打开与关闭
打开文件
在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件
open(文件名,访问模式)
f = open("test.txt",'w')
关闭文件
close()
f = open("test.txt",'w') #打开文件,w模式(写模式)
f.close() #关闭这个文件
相对路径和绝对路径
绝对路径: 从盘符开始的路径
相对路径: 相对当前源码所在的路径
绝对路径中为了不让\产生转义效果,需要在路径前面添加字母 r
否则需要在将每个\进行转义,写为\
f = open(r"D:\study\demo\test.txt","w")
f.write("I Love Python")
f.close()
中文编码问题
f = open(r"D:\study\demo\test.txt","w")
f.write("IT编程")
f.close()
f = open("test.txt","w",encoding="UTF-8")
f.write("IT编程")
f.close()
2. 文件读写
写数据(write)
使用write()可以完成向文件写入数据
f = open("test.txt","w")
f.write("hello world , i am here!")
f.close()
注意:
- 如果文件不存在那么创建;如果存在那么就先清空,然后写入数据
写数据(writelines)
f = open("test.txt","w",encoding="UTF-8")
#写法一:
f.write("IT编程\n高效学习\n学以致用\n") #通过换行符输出多行效果
#写法二:
content = ["IT编程\n","高效学习\n","学以致用\n"]
f.writelines(content) #通过writelines一次性写出列表的每个元素
#写法三:
content = ["IT编程","高效学习","学以致用"]
f.write("\n".join(content)) #使用字符串的join函数,为每个元素添加换行符
f.close()
读数据(read)
使用read(num)可以从文件中读取数据,num表示要从文件中读取的数据的长度(单位是字符),如果没有传入num,那么就表示读取文件中所有的数据。
#准备好需要读取的数据文件
f = open("test2.txt","w",encoding="UTF-8")
f.write("IT编程,高效学习")
f.close()
#-----------------------------------------
f = open("test2.txt","r",encoding="UTF-8")
# data = f.read() #没有指定读取的字符数,表示读取文件中所有的数据
# print(data)
data = f.read(2)
print("读取到的文件内容:",data)
data = f.read(4) #文件读取过程中的指针的定位会向后移动指定"字符数"
print("读取到的文件内容:",data)
f.close()
"""
读取到的文件内容: IT
读取到的文件内容: 编程,高
"""
注意:
- 如果open是打开一个文件,那么可以不用写打开的模式,即只写 open(‘test.txt’)
- 如果使用读了多次,那么后面读取的数据是从上次读完后的位置开始的
读数据(readline)
readline,读取一行,返回一个字符串
#准备好需要读取的数据文件
f = open("test2.txt","w",encoding="UTF-8")
f.write("i love you\n"*5)
f.close()
#-----------------------------------------
f = open("test2.txt","r",encoding="UTF-8")
while True:
content = f.readline()
if content:
print(f"{content}",end="")
else:
# print("content:",content,type(content))
break
f.close()
读数据(readlines)
就像read没有参数时一样,readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。
f = open("test2.txt","r",encoding="utf-8")
content = f.readlines()
print(content,type(content)) #输出的类型为列表类型(list)
#遍历列表中的内容,并在前面添加行号
#写法一:
# i = 1
# for data in content:
# print(f"{i}:{data}",end="")
# i+=1
#写法二:
for i,data in enumerate(content):
print(f"{i}:{data}", end="")
f.close()
所在位置(tell)
tell,返回指针当前所在的位置(指针所在位置前面的字节数)。
#准备好需要读取的数据文件
f = open("test3.txt","w",encoding="gbk")
f.write("IT编程,高效学习2")
f.close()
#-----------------------------------------------------------
f = open("test3.txt","r",encoding="gbk")
content = f.read(2)
print(content)
content = f.read(4)
print(content)
print("当前指针所在位置:",f.tell()) #输出内容为:14 或 10
#UTF-8中1个汉字3个字节,GBK中1个汉字为2个字节
#同样是读取2个字符,UTF-8返回为14,GBK返回为10
f.close()
定位(seek)
seek,定位文件读取的指针所在位置(字节)
seek的语法规则:
seek(offset[, whence])
offset – 开始的偏移量,也就是代表需要移动偏移的字节数
whence:可选,默认值为 0。
给offset参数一个定义,表示要从哪个位置开始偏移;
0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
#准备好需要读取的数据文件
f = open("test3.txt","w",encoding="gbk")
f.write("IT编程,高效学习2")
f.close()
#-----------------------------------------------------------
f = open("test3.txt","r",encoding="gbk")
content = f.read(2) #定位在2个字节后(一个英文字母占1个字节)
print(content)
f.seek(6) #直接定位在6个字节后(GBK字符集中一个中文算2个字节)
content = f.read(3) #读取三个字符(中文的逗号占2个字节)
print(content)
print("当前指针所在位置:",f.tell())
"""
IT
,高效
当前指针所在位置: 12
"""
访问模式
open("text.txt",mode="r+") #mode 设定的就是访问模式,决定可以进行的文件操作能力
说明:
当文件不存在时,访问模式w和a会新建文件,r会报错:FileNotFoundError: [Errno 2] No such file or directory
f = open("test4.txt","w",encoding="UTF-8")
f.write("IT编程,高效学习3")
f.close()
#-----------------------------------------------------------
# r+ 可读可写
f = open("test4.txt","a+",encoding="UTF-8")
# f.seek(0,2) #seek的模式2,为追加模式。在文件末尾读取或写入。
# data = f.read()
# print(data)
#f.seek(0) #定位在内容头部,会将现有内容覆盖重写
f.write(" 学以致用")
f.close()
更多访问模式的说明:
访问模式 | 说明 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
二进制读写
二进制文件的读写 (主要应用在图片、音乐、视频等文件的读写)
- rb:read binary 读取二进制文件
- wb:write binary 写入二进制文件
将文件的内容单纯的用0和1来进行读取和存储。不用指定字符集。
复制图片
fin = open("laoba.jpg",mode="rb")
fout = open("laoba_copy2.jpg",mode="wb")
data = fin.read(100)
print(data,type(data))
#输出的内容以b开头表示bytes(字节)方式读取的字符串,是以十六进制表示的内容
while True:
data = fin.read(100) #每次读取100个字符(自定义的缓冲区大小)
if data:
fout.write(data)
else:
break
while True:
data = fin.read(100)
if data != b"": #此处需要注意为b""
fout.write(data)
else:
break
fin.close()
fout.close()
3. 文件对象的函数和属性
flush()刷新缓冲区
文件写入过程:
数据 --> 缓冲区(内存中) --> 文件中(硬盘上)
【flush函数】刷新(清空)缓冲区
f = open("test5.txt",mode="w+",encoding="UTF-8")
f.write("IT编程")
f.flush() #flush函数:刷新缓冲区
while True:
pass
f.close()
如果没有flash函数,上面的代码将死循环的过程中断后,文件内没有文字输出;有了flash函数,中断死循环后,文件内有文字输出。
缓冲区清空时间节点:
当文件关闭的时候,自动清空缓冲区
当整个程序运行结束的时候自动清空缓冲区
当缓冲区写满了,会自动清空缓冲区
手动清空缓冲区
truncate()截断文件
trancate函数,从指针位置到结束的字符全部删除掉,只保留指针之前的内容。
#准备好需要读取的数据文件
f = open("test5.txt",mode="w+",encoding="utf-8")
for i in range(5):
f.write("IT编程"+str(i)+"\n") #11个字符
f.close()
#-----------------------------------------------------------
f = open("test5.txt",mode="r+",encoding="utf-8")
# f.seek(24)
# f.truncate() #从指针位置到结束的字符全部删除掉,只保留之前的内容
f.truncate(8)
f.seek(0)
print(f.read())
f.close()
文件对象
- 文件对象,是一个可迭代对象;可以直接通过遍历访问到每一行内容。
f = open("test5.txt","r",encoding="utf-8")
for line in f:
print(line,end="")
f.close()
- 可以通过其中的函数获取文件的属性和状态
f = open("test5.txt","r")
print("文件名:",f.name)
print("文件打开的模式",f.mode)
print("文件可写:",f.writable())
print("文件可读:",f.readable())
文件名: test5.txt
文件打开的模式 r
文件可写: False
文件可读: True