概述
Python中内置了文件读写的功能,现代的系统不允许普通的程序直接访问磁盘,所以,读写磁盘上的文件首先会请求打开一个文件的对象【也被称为文件描述符】,然后,通过系统提供的功能就可以读写文件
读文件(过程和使用)
- 过程:a.打开文件:open();b.读取文件内容:read();c.关闭文件:close()。说明:文件使用完毕之后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统在同一个时间段内打开的文件是有限的
- 使用:
> open(path,flag[,encoding,errors]),例如:f = open("致橡树.txt","r",encoding = "gbk")
> path:需要读取的文件的路径【相对路径和绝对路径】
> flag:打开方式
> r:只读的方式打开,注意:读取的文件必须存在
> rb:以二进制的形式打开一个文件,用于只读,注意:读取的文件必须存在
> r+:打开一个文件用于读写,注意:读取的文件必须存在
> w:只能写入内容,注意:如果该文件存在则覆盖,如果不存在则会自动创建
> wb:以二进制的方式打开一个文件,用于写入,注意:如果该文件存在则覆盖,如果不存在则会自动创建
> w+:打开一个文件用于读写,注意:如果该文件存在则覆盖,如果不存在则会自动创建
> a:打开一个文件,向其中追加内容
> 说明:rb和wb 表示使用二进制的形式打开文件,主要用来打开多媒体资源【图片,视频,音频等】
> encoding:编码格式,可写可不写
> errors:错误处理,可写可不写
> #注意:encoding一般使用关键字参数传参;打开文件的时候采用的编码格式必须和文件本身的编码格式一致,否则出现乱码
- 打开文件
当使用r的方式打开文件的时候,后面的encoding可加可不加。如果文件的格式为gbk,则可不加;如果文件的格式为utf-8的,最好加上encoding = "utf-8"
当使用rb/wb的方式打开文件的时候,后面的encoding不添加
- 读取文件内容
f = open("youbian.txt","r",encoding = "utf-8") #1.一次性读取文件的全部内容 str1 = f.read() print(str1) #2.读取指定字符数。如果不指定参数,则一次性读取全部的内容,如果指定参数,以字符串返回指定数量的数据,且每一行的结尾都有一个换行符"\n" str2 = f.read(5) print(str2) #3.读取整行,不管一行有多少个字符,一次性读取一行,以"\n"作为参照进行换行 str3 = f.readline() print(str3) #4.读取一行中前指定的字符 str4 = f.readline(3) print(str4) #5.读取所有行并返回列表,显式的出现\n str5 = f.readlines() print(str5)
- 关闭文件:f.close()
写文件 (过程和使用)
- 过程: a.打开文件:open(); b.将数据写入缓存:write();c.刷新文件内部缓存:flush();d.关闭文件:close()。向一个文件中写入内容,文件可以不存在,会自动创建
- 使用:
> path = "youbian.txt"
> #1.打开文件 wb a ,其中w表示将原来的内容全部替换,a表示在文件末尾进行追加
> f = open(path,"a",encoding="gbk") #注意:w表示将原来的内容全部替换,a表示在文件末尾进行追加
> #2.写入数据
> f.write("hello写入文件的数据需要换行的话") #注意:如果写入文件的数据需要换行的话,则需要手动添加\n
> #3.刷新缓冲区【加速数据的流动,保证缓冲区的畅通】
> f.flush() # 直接将内部缓冲区的内容立刻写入文件,而不是被动的等待自动刷新写入
> #4.关闭文件
> f.close()
编码和解码
字符串类型和字节类型之间的转换
字符串类型转换为字节类型:编码【encode】,utf-8:存储中文3个字节,gbk:存储中文2个字节
字节类型转换为字符串类型:解码【decode】
#新建一个file.txt文件 path = r"file.txt" #编码:字符串——>字节 with open(path,"wb") as f1: s1 = "today is a good day" f1.write(s1.encode("utf-8")) f1.flush() #解码:字节——>字符串 with open(path,"rb") as f2: data =f2.read() print(data) #b'today is a good day' print(type(data)) #<class 'bytes'> newData = data.decode("utf-8") print(newData) #today is a good day
注意:保证设置的编码格式和文件的编码格式相符,否则出现乱码
练习 (需求:文件内容的拷贝)
import os def myCopy(srcPath,desPath): #1.判断源文件是否存在 if not os.path.exists(srcPath): print("源文件不存在") return #2.判断源文件路径是否是文件 if not os.path.isfile(srcPath): print("源路径是文件夹,不是文件") return #3.打开文件 srcFile = open(srcPath,"rb") desFile = open(desPath,"wb") #4.获取源文件的大小 size = os.path.getsize(srcPath) #5.循环读取文件,并将读取出来的内容写到目标文件中 while size > 0: content = srcFile.read(1024) desFile.write(content) desFile.flush() size -= 1024 #6.关闭文件 srcFile.close() desFile.close() srcPath = "youbian.txt" desPath = "file.txt" myCopy(srcPath,desPath)