文件操作
操作文件时,一般需要经历如下步骤:
- 打开文件
- 操作文件
- 关闭文件
1、打开文件
格式:文件句柄 = open(‘文件‘, ‘模式‘, encoding=‘字符编码‘)
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。
常规模式:
- r - 只读模式(默认)
- w - 只写模式,不可读;不存在则创建,存在则清空原文件内容
- x - 只写模式,不可读;如果文件存在,报错;如果文件不存在,创建并写内容
- a - 追加模式,可读;不存在则创建,存在只能追加内容
注:encoding - 指定文件操作字符编码类型,一般常用万国码‘utf-8‘
示例:r 模式(只读)
1 f = open("db", "r", encoding="utf-8") 2 data = f.read() #读取文件内容 3 print(data) 4 f.close() #关闭文件 5 6 # 输出结果 7 tom
示例:w 模式(只写,不可读;不存在则创建,存在则清空原文件内容)
1 # 1.文件存在 2 f = open("db", "w", encoding="utf-8") 3 f.write("jarry") 4 f.close() 5 6 f = open("db", "r", encoding="utf-8") 7 data = f.read() 8 print(data) 9 f.close() 10 11 #输出结果:清空原内容tom,写入新内容jarry 12 jarry 13 14 # 2.文件不存在 15 f = open("db2", "w", encoding="utf-8") 16 f.write("tom") 17 f.close() 18 19 f = open("db2", "r", encoding="utf-8") 20 data = f.read() 21 print(data) 22 f.close() 23 24 #输出结果,在.py同目录内自动生成名为db2的文件 25 tom
示例:x 模式(只写模式,不可读;如果文件存在,报错;如果文件不存在,创建并写内容)
1 # 1. 文件存在 2 f = open("db", "x", encoding="utf-8") 3 f.write("tom") 4 f.close() 5 6 # 输出结果,报错 7 FileExistsError: [Errno 17] File exists: ‘db‘ 8 9 # 2. 文件不存在 10 f = open("db3", "x", encoding="utf-8") 11 f.write("tom") 12 f.close() 13 14 #执行结果:同目录下生成db3文件 15 16 f = open("db3", "r", encoding="utf-8") 17 data = f.read() 18 print(data) 19 f.close() 20 21 # 输出结果:db3内容 22 tom
示例:a 模式( 追加模式,可读;不存在则创建,存在只能追加内容)
1 # 1. 文件存在 2 f = open("db5", "a", encoding="utf-8") 3 f.write("jarry \n") #\n 写入文件内容自动换行 4 f.close() 5 6 f = open("db3", "r", encoding="utf-8") 7 data = f.read() 8 print(data) 9 f.close() 10 11 # 输出结果: 12 tom 13 jarry
"b"表示以字节的方式操作
- rb 或 r+b
- wb 或 w+b
- xb 或 x+b
- ab 或 a+b
注:以b方式打开文件时,读取到的内容是字节类型,写入时也需要提供字节类型,且无需指定encoding字符编码
1 # 以字节方式指定字符编码,执行报错 2 f = open("db4", "r", encoding="utf-8") 3 data = f.read() 4 print(data,type(data)) 5 f.close() 6 7 #执行报错结果 8 ValueError: binary mode doesn‘t take an encoding argument
示例:"b"表示以字节的方式操作
1 # 1. 以字节形式wb模式写入数据,并输出写入结果 2 f = open("db4", "wb") 3 f.write(bytes(10)) 4 f.write(bytes("ab", encoding="utf-8")) # 字符串指定编码格式,并转换成字节 5 f.write(bytes("龙", encoding="utf-8")) # 字符串指定编码格式,并转换成字节 6 f.close() 7 8 f = open("db4", "rb") #以字节形式打开文件,如果不加b以字符形式打开文件 9 data = f.read() 10 print(data, type(data)) #查看结果及数据类型 11 print() 12 f.close() 13 14 # 输出结果 15 b‘\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ab\xe9\xbe\x99‘ <class ‘bytes‘> #bytes类型 16 17 # 2. 以字节形式ab模式写入数据,并输出写入结果 18 f = open("db4", "ab") 19 f.write(bytes("厚德", encoding="utf-8")) 20 f.close() 21 22 f = open("db4", "rb") 23 data = f.read() 24 print(data, type(data)) 25 print() 26 f.close() 27 28 # 输出结果 29 b‘\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00a\xe9\xbe\x99\xe5\x8e\x9a\xe5\xbe\xb7‘ <class ‘bytes‘> 30 31 # 3. 以字节形式xb模式写入数据,并输出写入结果 32 f = open("db4", "xb") 33 f.write(bytes("载物", encoding="utf-8")) 34 f.close() 35 36 # 输出结果 37 f = open("db4", "xb") 38 FileExistsError: [Errno 17] File exists: ‘db4‘
"+"表示可以同时读写某个文件
- r+, 读写【可读,可写】
- w+,写读【可读,可写】
- x+ ,写读【可读,可写】
- a+, 写读【可读,可写】
示例:
1 # r+模式 2 f = open("db5", "r+", encoding="utf-8") 3 f.write("testr") 4 f.close() 5 6 f = open("db5", "r", encoding="utf-8") 7 data = f.read() 8 print(data, type(data)) 9 f.close() 10 11 # 输出结果 12 testr <class ‘str‘> 13 14 15 # w+模式 16 f = open("db5", "w+", encoding="utf-8") 17 f.write("testw") 18 f.close() 19 20 f = open("db5", "r", encoding="utf-8") 21 data = f.read() 22 print(data, type(data)) 23 f.close() 24 25 # 输出结果,清空原文件内容 26 testw <class ‘str‘> 27 28 29 # a+模式 30 f = open("db5", "a+", encoding="utf-8") 31 f.write("testa") 32 f.close() 33 34 f = open("db5", "r", encoding="utf-8") 35 data = f.read() 36 print(data, type(data)) 37 f.close() 38 39 #输出结果,追加内容 40 testwtesta <class ‘str‘>
打开文件操作小结:
- 非字节类型,一般指定字符编码为utf-8。
- 模式中有b,按字节形式操作;模式中无b,按字符形式操作。
- 字节形式输入字符,字符需要指定编码格式,并转换成字节。
2、操作文件
常用操作文件
fileno() #文件描述符 flush() #刷新文件内部缓冲区 isatty() #判断文件是否是tty设备 read() #读取数据,有b按字节;无b按字符 readable() #是否可读 readline() #仅读取一行数据 seek() #指定文件中指针位置 seekable() #指针是否可操作 tell() #获取指针位置 truncate() #截断数据,指针位置后的数据清空 writable() #是否可写 write() #写内容
示例
# db5文件内容 alex tom eric jarry # 以utf-8格式,以r+读写模式打开db5文件 f = open("db5", "r+", encoding="utf-8") # readable(),查看文件是否可读 data1 = f.readable() print("readable():", data1, type(data1)) # 输出结果 # readable(): True <class ‘bool‘> # read(): ale tom eric jarry <class ‘str‘> # read(),读取文件内容 data2 = f.read() print("read():", data2, type(data2)) # 输出结果 # read(): ale tom eric jarry <class ‘str‘> # fileno(),文件描述符 data3 = f.fileno() print("fileno():", data3, type(data3)) # 输出结果 # fileno(): 3 <class ‘int‘> # isatty(),判断文件是否为tty设备 data4 = f.isatty() print("isatty():", data4, type(data4)) # 输出结果 # isatty(): False <class ‘bool‘> # tell(),当前指针所在位置 data5 = f.tell() print("tell():", data5, type(data5)) data2 = f.read() print("read():", data2, type(data2)) data5 = f.tell() print("tell():", data5, type(data5)) # 输出结果 # tell(): 0 <class ‘int‘> #指针初始位置为0 # read(): alex tom eric jarry <class ‘str‘> #读取所有数据 # tell(): 19 <class ‘int‘> #指针位置到数据结尾 # seekable(),指针是否可操作 data6 = f.seekable() print("seekable:", data6, type(data6)) # 输出结果 # seekable: True <class ‘bool‘> # seek(),指定指针位置 data7 = f.seek(3) print("seek:", data7, type(data7)) data5 = f.tell() print("tell():", data5, type(data5)) # 输出结果 # seek: 3 <class ‘int‘> # tell(): 3 <class ‘int‘> # write(),写入数据,如果指定指针位置,写入数据时从指针位置开始向后覆盖 f.write("long") # 输出结果,db5文件变化 # alelongm eric jarry # writable(),文件是否可写入 data8 = f.writable() print("writeable():", data8, type(data8)) # 输出结果 # writeable(): True <class ‘bool‘> # truncate(),截取数据,指针位置后的数据清空 f.truncate(f.seek(3)) #close(),关闭文件 f.close() # 输出结果,db5指针位3后数据全部清空 # ale #close(),关闭文件 f.close() # readline(),每次读取一行数据 f = open("db6", "w+", encoding="utf-8") f.write("alex\n") #模拟多行数据环境 f.write("tom\n") f.write("jarry\n") f.write("eric\n") f.close() f = open("db6", "r+", encoding="utf-8") data = f.readline() #每次读取一行 print("readline():", data, type(data)) data = f.readline() print("readline():", data, type(data)) data = f.readline() print("readline():", data, type(data)) f.close() # 输出结果 # readline(): alex # <class ‘str‘> # readline(): tom # <class ‘str‘> # readline(): jarry # <class ‘str‘> # flush(),刷新内部缓存数据到文件 f = open("db7", "w+", encoding="utf-8") f.write("tom") #如果不加入f.flush(),上面操作无法执行,缓存区数据不能写入文件,需要等待全部操作完成后执行 f.flush() input("your name:") f.close()
扩展1:for循环对象f = open(xxx)
f = open("db7", ‘r+‘, encoding="utf-8") for line in f: print(line,type(line)) f.close() # 输出结果 # alex # <class ‘str‘> # tom # <class ‘str‘> # jarry # <class ‘str‘> # eric <class ‘str‘>
扩展2:同时打开两个文件
#示例格式 with open(‘db1‘) as f1, open("db2") as f2: pass #da1读取一行数据,db2写入一行数据 with open(‘db1‘, ‘r‘, encoding="utf-8") as f1, open("db2", ‘w‘,encoding="utf-8") as f2: for line in f1: new_str = line.replace("alex", ‘st‘) f2.write(new_str)
3、关闭文件
f.close()
with方式打开一个文件
with open(‘xb‘) as f: pass
时间: 2024-10-28 21:52:55