读取文件最后一行 f.seek(offset,whence=0),文件操作
file.seek()方法标准格式是:seek(offset,whence=0)offset:开始的偏移量,也就是代表需要移动偏移的字节数, whence:给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。默认为0
whence 的默认参数是0。
whence 还有两种情况 是1,或者2:
1的时候,相对当前坐标的移动,可以是正的也可以是负的。
2的时候相对于文件结束的移动,通常应该是负的。
f=open('d.txt','rb')
for i in f:
offs=-3
n=1
while True:
f.seek(offs,2)
print(f'你好啊这是第{n}次',f.readline(),offs)
data=f.readlines()
print('data',data)
if len(data) > 1:
print('最后一行',data[-1].decode('utf-8'))
break
offs*=2
n += 1
输出:
f=open('d.txt','rb')
for i in f:
offs=-3
n=1
while True:
f.seek(offs,2)
print(f'你好啊这是第{n}次',f.readline(),offs)
data=f.readlines()
print('data',data)
if len(data) > 1:
print('最后一行',data[-1].decode('utf-8'))
break
offs*=2
n += 1
文件 d.txt:
123hello
123hello
123asdfasdfasdf
哼123456789哈
示例2:
f=open('seek.txt','rb')
print(f.tell())
f.seek(-5,2)
print(f.read())
print(f.tell())
f.seek(3,1)
print(f.read())
print(f.tell())
输出:
f=open('seek.txt','rb')
print(f.tell())
f.seek(-5,2)
print(f.read())
print(f.tell())
f.seek(3,1)
print(f.read())
print(f.tell())
seek.txt文件
hello
你好王八蛋
123456
abcdef
f=open('seek.txt','rb')
print(f.tell())
f.seek(10,1)
print(f.tell())
f.seek(3,1)
print(f.tell())
输出:
0
10
13
f=open('seek.txt','rb')
print(f.tell())
f.seek(10,1)
print(f.tell())
f.seek(3,1)
print(f.tell())
输出:
0
10
3
f=open('b.txt','r+',encoding='utf-8')
data=f.read()
print('000000000000',data)
f.write('\n你好')
f.seek(0)
data=f.read()
print('11111111111',data)
输出:
000000000000 你好
he你好
你好
11111111111 你好
he你好
你好
你好
Python3 的encode和decode,open
此处的b.txt是utf-8编码文件
你好
he你好
你好
你好
#f=open('b.txt','r+',encoding = 'utf-8') # 此处的b.txt是utf-8编码写进去的
f=open('b.txt','r+') # 在window是系统中默认是gbk编码, open如果没有指定encoding,默认是以系统的默认编码进行decode打开的str
b_read =f.read() # f.read()是以打开文件后decode('gbk')后的str
print('01: ',b_read,type(b_read))
print('------------01 over----------------\n')
gbk_encode_data=b_read.encode('gbk') # 将上面的str以原本的gbk编码,进行编码encode('utf-8')变成二进制的unicode bytes编码
print('02: ',gbk_encode_data,type(gbk_encode_data))
print('------------02 over----------------\n')
utf8_decode_data=gbk_encode_data.decode('utf-8') # 将二进制的unicode编码进行utf-8解码,变为我们认识的字符串
print('03',utf8_decode_data,type(utf8_decode_data))
print('------------03 over----------------\n')
输出:
01: 浣犲ソ
he浣犲ソ
浣犲ソ
浣犲ソ <class 'str'>
------------01 over----------------
02: b'\xe4\xbd\xa0\xe5\xa5\xbd\nhe\xe4\xbd\xa0\xe5\xa5\xbd\n\xe4\xbd\xa0\xe5\xa5\xbd\n\xe4\xbd\xa0\xe5\xa5\xbd' <class 'bytes'>
------------02 over----------------
03 你好
he你好
你好
你好 <class 'str'>
------------03 over----------------
以二进制的b进行打开文件
a.txt是gbk编码写的
你好啊,美女
f=open('a.txt','rb')
# data=f.read().decode('gbk')
data_b=f.read()
print(data_b,type(data_b))
data=data_b.decode('gbk')
print(data,type(data))
输出:
b'\xc4\xe3\xba\xc3\xb0\xa1,\xc3\xc0\xc5\xae' <class 'bytes'>
你好啊,美女 <class 'str'>
f=open('b.txt','r+',encoding = 'utf-8')
data_b=f.read()
print(data_b,type(data_b))
输出:
你好
he你好
你好
你好 <class 'str'>
f=open('a.txt','r') # 对于gbk编码的,在本地的window系统中,没有指定encoding,默认是以本系统的编码进行解码的
data_b=f.read()
print(data_b,type(data_b))
输出:
你好啊,美女 <class 'str'>
其他的待验证
# f=open('b.txt','r',encoding='utf-8',newline='') #读取文件中真正的换行符号
f=open('b.txt','r',newline='') #读取文件中真正的换行符号
# f=open('b.txt','r+',encoding='utf-8',newline='') #读取文件中真正的换行符号
print(f.closed)
print(f.encoding)
f.flush()
print(f.readlines())
print(f.tell())
# print(f.readline())
print(f.tell())
data=f.read(1)
print(data)
f.truncate(10)
# f.flush() #讲文件内容从内存刷到硬盘
# f.closed #文件如果关闭则返回True#
# f.encoding #查看使用open打开文件的编码
# f.tell() #查看文件处理当前的光标位置
# f.seek(3) #从开头开始算,将光标移动到第三个字节
# f.truncate(10) #从开头开始算,将文件只保留从0-10个字节的内容,文件必须以写方式打开,但是w和w+除外
写入自己的博客中才能记得长久