1. 操作文件三要素:(打开文件后,一定要关闭)
a. 路径:E:pythonprojectsaa.txt
b. 编码:utf-8
c. 模式:只读 只写 读写
r:只读 rb:二进制格式读
w:只写 wb:二进制格式写
a:追加 ab:二进制格式追加
r+:能读能写(最常用,最强大)
w+:写读(先清空再写),文件不存在时创建
a+:追加写读。如果该文件已存在,追加写。如果该文件不存在,创建新文件用于读写。
r+b w+b a+b (按二进制格式)
2. 文件对象语法:
file object = open(file_name [, access_mode][, buffering])
各个参数的细节如下:
file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。
access_mode:
access_mode决定了打开文件的模式:只读,写入,追加等。
所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
buffering:
如果buffering的值被设为0,就不会有寄存。
如果buffering的值取1,访问文件时会寄存行。
如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。
如果取负值,寄存区的缓冲大小则为系统默认。
3. 只读 读取utf-8编码数据,转换成Unicode编码的数据 文件在硬盘上时,一定是某种编码,utf-8或gbk等等
a. mode = "r" 模式 转换
open(文件路径,encoding= "utf-8",mode=“r”)
b. mode ="rb" 不做转换 读取的时候 rb模式的表现形式 bytes
open(文件路径,mode=“rb”) 不常用
绝对路径 E:pythonprojectsaa.txt
相对路径 直接写文件名
# a-- 读取在硬盘里的utf-8编码数据,读到内存后转换成Unicode编码的数据,在内存里的表现形式为字符串 obj = open("D:\abc.txt",encoding="utf-8",mode="r") content = obj.read() # 字符串类型 obj.close() print(content) # b-- 不设置编码转换的时候,表现形式为bytes类型 obj = open("D:\abc.txt",mode="rb") content = obj.read() # bytes类型 obj.close() print(content) obj = open("user.txt",encoding="utf-8",mode="r") content = obj.read() # 字符串类型 obj.close() print(content)
4. 只写 不存在时创建,存在时先清空然后覆盖内容
#a---- open(文件路径,encoding= "utf-8",mode="w") obj = open("a.txt",encoding="utf-8",mode="w") obj.write("hello word") obj.close() #b---- open(文件路径,mode=“wb”) 不常用 obj = open("a.txt",mode="wb") obj.write("hello word 00000".encode("utf-8")) obj.close() #写完之后不能读 obj = open("a.txt",mode="w") content = obj.read() obj.close() print(content)
5. 只追加 a ******a+只能在最后写******
obj = open("a.txt",encoding="utf-8",mode="a") obj.write("小红") obj.close() obj = open("a.txt",mode="ab") obj.write("000".encode("utf-8")) obj.close() # r+ 读写 默认在最后写 obj = open("a.txt",encoding="utf-8",mode="r+") data = obj.read() # 读 obj.write("gggg") # 写,单独写的时候,会从头开始写,有内容的话会覆盖 obj.close() print(data) obj = open("a.txt",encoding="utf-8",mode="r+") obj.write('666') # 写,单独写的时候,会从头开始写,有内容的话会覆盖 obj.close() obj = open("a.txt",encoding="utf-8",mode="r+") data = obj.read(4) obj.write('666') # 依旧写到最后位置 obj.close() print(data) obj = open("a.txt",encoding="utf-8",mode="r+") data = obj.read(2) obj.seek(1) # seek是字节,汉字三个字节一位,标明了要写入的位置 obj.write("0") # 单独写的时候,会从头开始写,有内容的话会覆盖 obj.close() # 指定写的时候,有内容的话会覆盖,(只是看不到,) print(data)
常用的文件对象方法:
# read(读到第几个字符(r)字节(rb)) 默认读取所有文件 obj = open("a.txt",encoding="utf-8",mode="r+") data = obj.read(2) print(data) obj = open("a.txt",mode="r+b") data = obj.read(2) print(data) # write("字节(wb)或字符串(w)")#不存在时创建,存在时先清空然后覆盖内容 obj = open("a.txt",encoding="utf-8",mode="w+") obj.write("2") obj.close() # seek(n,location) 指定位置写并覆盖 指定指针位置 不管是r还是rb n永远都是字节 ;location指针位置,可以不写,0,1,2是三个模式,0是开头,1是默认,2是最后 obj = open("a.txt",encoding="utf-8",mode="r+") obj.seek(1) # seek是字节,汉字三个字节一位,标明了要写入的位置 data = obj.read(2) obj.close() print(data) # **tell() 读取当前指针在哪 obj = open("a.txt",encoding="utf-8",mode="r+") # obj.tell() # obj.close() num = int(input("请输入要读取的字符:")) # 因为编码不同,当文件里是汉字时,写入数字和字母会出现错误,因为字母,数字和汉字所占的位数不同导致的 data = obj.read(num) obj.seek(obj.tell()) obj.write("34") flush() # 将内存中的内容强制刷到硬盘 obj = open("aaa",encoding="utf-8",mode="w") while True: data = input(">>>") obj.write(data) # 因为无法执行close,所以写的只能写到内存中 obj.flush() # 强刷会把内容强制刷到硬盘里,就能读到东西了 obj.close() obj = open("aaa",encoding="utf-8",mode="r"+) val = obj.read() print(val) readline() # 只读一行 obj = open("a.txt",encoding="utf-8",mode="r+") data = obj.readline() print(data) # 读一次之后,指针在第2个位置,再次去读就会从下一个位置开始读 data = obj.readline() print(data) readlines() # 按行读到所有东西 xreadlines() # py3里没有这个功能了 #重点: # for line in obj : 把每一行都打印出来 等价于py2里的 xreadlines() obj = open("a.txt",encoding="utf-8",mode="r+") for line in obj: print(line) obj.close() # 手动关毕 # 打开文件后,一定要关闭 obj = open(文件路径,mode=rb) xxxx obj.close() #自动关闭 with open(文件路径,mode= "rb") as obj: xxx # 代码执行完毕后,自动关闭文件 truncate() # 截取文件内容,根据指针位置,只保留之前的数据 obj = open("a.txt",encoding="utf-8",mode="r+") obj.seek(3) obj.truncate() obj.close() writeable() # 是否可写 # 以r 模式打开的时候不可写 readable() #是否可读 # 以w 模式打开的时候不可读 fileno() # 文件描述符,就是一个数字