读取文件最后一行 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+除外
posted @ 2021-05-13 10:13  ty1539  阅读(486)  评论(0编辑  收藏  举报