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 设定的就是访问模式,决定可以进行的文件操作能力

python文件类型怎么判断 python中如何区分文件类型_IT


说明:

当文件不存在时,访问模式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