一、使用Python打开文件的方法
使用Python打开文件时需要注意目标文件的路径和文件的编码方式,若没有指定路径和编码方式默认使用的是相对路径和系统默认的编码方式
open()方法
f = open("test", encoding="utf-8")
data = f.read()
print(data)
opne()方法默认使用r模式对文件进行打开
使用open()方法对文件进行操作结束的时候必须要将其从内存中进行回收,否则会占用内存
回收方法:
f.close()
with方法:
和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)
二、关于r模式下的方法
1、使用r模式打开文件
Python默认使用r模式打开文件,不需要特殊指定
with open("test", encoding="utf-8") as f:
data = f.read()
print(data)
运行结果:
1
2
3
4
5
2、关于读的操作方法
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模式下的方法:
1、使用w模式打开文件
使用w模式对文件进行操作的时候,若目标文件不存在则创建,若目标文件存在则将目标文件清空
在对文件进行写操作的时候内容必须为字符串;当一行结束的时候必须要使用换行符,否则还是在同一行内进行输入
with open("test", "w", encoding="utf-8") as f:
data1 = f.write()
2、关于写的操作方法
使用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行
四、关于a模式下的方法:
1、使用a模式打开文件
with open("test", "a", encoding="utf-8") as f:
data1 = f.write()
2、关于追加的操作方法
追加操作和写操作相同,不同的是追加操作是在文件末尾进行写
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行
五、在对文件进行修改的时候计算机内的操作
- 1、软件将硬盘上的二进制文件读取到内存中进行解码,并将解码得到的结果通过软件输出到屏幕
- 2、使用软件在内存中对文件进行修改
- 3、修改完后将文件以二进制格式覆盖原文件在硬盘中的二进制
六、以字节方式对文件进行操作
1、rb
打开文件的方法:
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行
2、wb
打开文件的方法:
open("new_test", "wb")
写入方式:在使用字节对文件进行写操作的时候需要将字符串转换为字节后进行输入
with open("new_test", "wb") as f:
data = "这是第11行\n".encode("utf-8")
f.write(data)
new_test的文件内容:
这是第11行
3、ab
打开文件的方法:
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行
七、文件操作的其他方法:
1、flush():将文件在内存中的内容存放到硬盘中
使用方法:
f.flush()
2、tell():查看当前光标所在的位置(以字节为单位)
使用方法:
print(f.tell())
3、seek():移动光标(以字节为单位)
使用方法:
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行