使用Python打开文件时需要注意目标文件的路径和文件的编码方式,若没有指定路径和编码方式默认使用的是相对路径和系统默认的编码方式
f = open("test", encoding="utf-8")data = f.read()print(data)
opne()方法默认使用r模式对文件进行打开
使用open()方法对文件进行操作结束的时候必需要将其从内存中进行回收,否则会占用内存
回收方法:
f.close()
和open()方法不同,使用with方法打开文件对文件进行操作结束的时候可以不用手动回收打开文件
使用方法:
with open("test", encoding="utf-8") as f: data = f.read() print(data)
with方法还可以同时打开多个文件,如:
with open("test1", encoding="utf-8") as f1, open("test2", encoding="utf-8") as f2: data1 = f1.read() data2 = f2.read() print(data1) print(data2)
Python默认使用r模式打开文件,不需要特殊指定
with open("test", encoding="utf-8") as f: data = f.read() print(data)
运行结果:
1
2
3
4
5
with open("test", encoding="utf-8") as f: # 读取整个文件内容 data1 = f.read() print("data1的内容是:", data1) # 判断打开的文件能否是可读 data2 = f.readable() print("data2的内容是:", data2) # 每次只读取文件的一行 data3 = f.readline() print("data3的内容是:", data3) # 将文件的每一行内容读取出来放到一个列表中 data4 = f.readlines() print("data4的内容是:", data4)
运行结果:
data1的内容是: 1
2
3
4
5
data2的内容是: True
data3的内容是:
data4的内容是: []
可以发现data3和data4的内容为空,这是由于对文件进行读操作的时候都是从当前游标所在的位置进行读取,若游标在文件的末尾的时候在进行读操作的话并不会读取到内容
with open("test", encoding="utf-8") as f: # 读取整个文件内容 # data1 = f.read() # print("data1的内容是:", data1) # 判断打开的文件能否是可读 data2 = f.readable() print("data2的内容是:", data2) # 每次只读取文件的一行 data3 = f.readline() print("data3的内容是:", data3) # 将文件的每一行内容读取出来放到一个列表中 data4 = f.readlines() print("data4的内容是:", data4)
data2的内容是: True
data3的内容是: 1
data4的内容是: ['2\n', '3\n', '4\n', '5']
使用w模式对文件进行操作的时候,若目标文件不存在则创立,若目标文件存在则将目标文件清空
在对文件进行写操作的时候内容必需为字符串;当一行结束的时候必需要使用换行符,否则还是在同一行内进行输入
with open("test", "w", encoding="utf-8") as f: data1 = f.write()
使用w模式对文件进行操作:
为了测试方便创立了一个新的空文件new_test
with open("new_test", "w", encoding="utf-8") as f: # 将相应的内容写到目标文件中 f.write("这是第1行\n这是第2行\n这是第3行\n") # 判断文件能否可写 data1 = f.writable() print("data1的内容是:", data1) # 将列表中的每个元素都写入到目标文件中 f.writelines(["这是第4行\n", "这是第5行\n", "这是第6行\n"])
运行结果:
data1的内容是: True
文件new_test的内容:
这是第1行这是第2行这是第3行这是第4行这是第5行这是第6行
with open("test", "a", encoding="utf-8") as f: data1 = f.write()
追加操作和写操作相同,不同的是追加操作是在文件末尾进行写
with open("new_test", "a", encoding="utf-8") as f: f.write("这是第7行") data1 = f.writable() print("data1的内容是:", data1) f.writelines(["这是第8行\n", "这是第9行\n", "这是第10行\n"])
运行结果:
data1的内容是: True
文件new_test的内容:
这是第1行这是第2行这是第3行这是第4行这是第5行这是第6行这是第7行这是第8行这是第9行这是第10行
打开文件的方法:
open("test", "rb")
当使用字节方式对文件进行操作的时候无需指定编码
读取方式:
在使用字节的情况下需要读取文件内容的时候要将字节转化为字符串后进行输出,否则会以字节形式进行输出。
with open("new_test", "rb") as f: data = f.read() print(data.decode("utf-8"))
运行结果:
这是第1行这是第2行这是第3行这是第4行这是第5行这是第6行这是第7行这是第8行这是第9行这是第10行
打开文件的方法:
open("new_test", "wb")
写入方式:在使用字节对文件进行写操作的时候需要将字符串转换为字节后进行输入
with open("new_test", "wb") as f: data = "这是第11行\n".encode("utf-8") f.write(data)
new_test的文件内容:
这是第11行
打开文件的方法:
open("new_test", "ab")
写入方式:和wb的方式一样
with open("new_test", "ab") as f: data = "这是第12行\n".encode("utf-8") f.write(data)
new_test的文件内容:
这是第11行这是第12行
使用方法:
f.flush()
使用方法:
print(f.tell())
使用方法:
with open("new_test", "ab") as f: f.seek(10) # 将光标从文件开始处向后移动10个字节 print(f.tell()) f.seek(10,1) # 将光标相对于前面的光标所在的位置处向后移动10个字节 print(f.tell()) f.seek(-10,2) # 将光标从文件末尾处向前移动10个字节
运行结果:
10
20
seek(num,2)可用来获取日志的最后一行,代码如下:
测试文件test文件内容
这是第1行这是第2行这是第3行这是第4行这是第5行这是第6行这是第7行这是第8行这是第9行这是第10行这是第11行这是第12行这是第13行这是第14行
获取测试文件test的最后一行
with open("test", "rb") as f: # 遍历文件 for i in f: # 指定一个seek的初始值 init = -10 while True: f.seek(init, 2) data_list = f.readlines() # 判断从光标所在的位置往后读取,能否超过一行 if len(data_list) > 1: print(data_list[-1].decode("utf-8")) break else: init *= 2
运行结果
这是第14行