【closed】
判断文件是否关闭
f = open('a.txt','w')
print(f.closed) #False
【encoding】
取的是文件打开的编码,和原文件以什么编码存储无关
f = open('a.txt','w', encoding='utf-8')
print(f.encoding)
输出:
utf-8
a.txt文件以utf-8格式存放在硬盘上,但是encoding语句取的是文件打开时所使用的编码
但是,如果存放的格式和解码的格式不一致的话,就会出现乱码的现象
如果不知道文件使用什么格式存储的,可以用latin-1
f = open('.txt','r',encoding = 'latin-1')
data = f.read()
print(data)
latin-1可以尽可能多的还原原文件
【flush()】
自动刷新保存(每隔一段时间把内存里的数据自动保存到硬盘里)
【tell()】
当前光标所在的位置(光标的移动以字节为单位,回车算一个字节)
原test2内容:
你好
abcd
用tell()获取光标所在的字节:
example1:
f = open('test2','r', encoding='utf-8')
print(f.tell())
print(f.readline())
print(f.tell())
输出:
0
你好
8 #读出8是因为中文占三个字节,回车占两个字节,如果用rb模式读取的话是\r\n
example2:
f = open('test2','r', encoding='utf-8')
print(f.tell())
print(f.readlines())
print(f.tell())
输出:
0
['你好\n', 'abcd']
12
注意:以上差异是由于函数readline()和readlines()的不同造成的
【补充open()的参数newline】
原test2中的内容:
你好
abcd
newline用法举例:
---------------不使用newline参数---------------
f = open('test2','r', encoding='utf-8')
print(f.readlines())
输出:
['你好\n', 'abcd']
---------------使用newline参数---------------
f = open('test2','r', encoding='utf-8',newline='')
print(f.readlines())
输出:
['你好\r\n', 'abcd']
注意:虽然windows系统中,回车是\r\n,但是python默认将回车全部转换为\n的形式,newline参数为空可将回车按原始形式读出
【seek()】
用来控制光标的移动(移动单位为字节)
原test2中的内容:
你好
abcd
example1:
f = open('test2','r', encoding='utf-8')
f.seek(0)
print(f.tell())
print(f.readline())
输出:
0
你好
example2:
f = open('test2','r', encoding='utf-8')
f.seek(3)
print(f.tell())
print(f.readline())
print(f.read())
输出:
3
好
abcd
seek函数的第二个参数:可以指定从哪里开始seek
原test2中的内容:
你好
ab
123
456
example1:参数为0
f = open('test2','r',encoding='utf-8')
f.seek(3,0) #从0位置开始seek(默认值)
example2:参数为1
f = open('test2','rb') #二进制模式不能有encoding arguments
f.seek(3,1) #从上一次光标停留的位置开始seek(这种情况下需要用rb模式打开文件)
example3:参数为2
f = open('test2','rb')
f.seek(-5,2)
print(f.read())
输出:
b'\r\n456'
应用举例:读数据条数比较多的日志文件时,用seek函数查找最后一条日志可以节约内存
方法1:readlines方法。
缺点:需要将整个文件都读进内存成为一个列表,占用空间较大
f = open('test2','rb')
data = f.readlines()
print(data[-1].decode('utf-8'))
输出:
456
方法2:seek方法。
直接用文件名进行for循环,并使用seek函数得到最后一行。
优点:直接用文件名进行for循环时,要一行给一行,避免了占用过多内存空间的问题
f = open('test2','rb')
for i in f:
print(i)
具体实例:
原test2内容:
你好
ab
123
456
高级解法:
f = open('test2','rb')
for i in f:
offs = -10
while True:
f.seek(offs,2)
data = f.readlines()
if len(data)>1:
print('%s' %(data[-1].decode('utf-8')))
break
offs*=2
输出:
456
【read()】
原test2中的内容:
你好
abcd
example:
f = open('test2','r',encoding='utf-8')
data = f.read(1)
print(data) #你
注意:tell()和seek()都是按字节读取数据,但是read()读取数据的单位是字符
【truncate()】
作用:truncate() 方法用于从文件的首行首字符开始截断,截断文件为 size 个字节,无 size 表示从当前位置截断;截断之后 V 后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字节大小。
语法:
fileObject.truncate( [ size ])
size -- 可选,如果存在则文件截断为 size 字节
没有返回值
原test2中的内容:
你好
abcd
example:
f = open('test2','a+',encoding = 'utf-8') #a+和r+都可以,但是w+不行,因为w+会把数据清空
f.truncate(10)