python3读取txt⽂本最后⼀⾏
由字节组成
⾸先要理解txt⽂本都是实际由字节组成的,⽐如对于⼀个utf-8⽆BOM编码⽅式存储的txt⽂件,如果⽂件内容为空,那么该txt⽂件⼤⼩为0字节,⼀个ascii字符占⼀个字节,⼀个中⽂字符占3个字节。
1q;付
⽐如utf-8⽆BOM编码⽅式存储的txt⽂件,⽂本内容如上,那么该⽂件的⼤⼩则为6字节。
readlines函数
例⼦⽂本内容:
⽂本编码:utf-8⽆BOM
代码:
out = open('新建⽂本⽂档.txt',encoding = 'utf-8')
lines = adlines()
print(lines)
for line in lines:
print(bytes(line,encoding = 'utf-8'))
运⾏结果:
说明⼀下,如果最后⼀⾏是空⾏,那么lines列表的最后⼀个元素则是’333\n’。
可以看出readlines⽅法是⼀次读取所有⾏存⼊list中,准确的说,是从当前的⽂件指针读到⽂本末尾。
当然是r模式(读模式)时,指针都是从0开始。
python3⾃动转换\r\n
python3在使⽤readline和readlines⽅法时,会⾃动将Windows下换⾏符\r\n变成\n。
如上同样的⽂本。
运⾏如下代码:
import os
out = open('新建⽂本⽂档.txt',encoding = 'utf-8')
lines = adlines()
print(lines)
for line in lines:
print(bytes(line,encoding = 'utf-8'))
out = open('新建⽂本⽂档.txt','rb')#b,以⼆进制形式读取
ad())
filesize = size('新建⽂本⽂档.txt')
print(filesize)
运⾏结果为:
21是⽂件⼤⼩,21字节。如果是从lines列表⾥数字节⼤⼩,是7+4+4+3=18,为什么实际上多了三个字节呢,是因为python3对换⾏符进⾏了转换,实际存储的每个换⾏符还是\r\n。所以,当你不是b模式下读取⽂本时,换⾏符是‘\n’,但当你是b模式读取⽂件时(且平台是Windows),不管是read函数还是readlines函数,其中的换⾏符是b‘\r\n’。
seek函数
如上同样的⽂本。
运⾏如下代码:
dat_file = open('新建⽂本⽂档.txt', 'rb')
dat_file.seek(20, 0)
print(ll())
print(ad())
运⾏结果为:
如果改为dat_file.seek(21, 0),运⾏结果为:。即读取到的是空。当然改成21以上的数字也是读取为空。
原理:之前提到例⼦⽂本⼤⼩为21字节,所以ad() (假设不移动⽂件指针)读取到的bytes类别字符串的长度也为21,其索引是0-20。
如上图所⽰,只有当⽂件指针在0-20范围时,才可能读到内容。
读取⽂本最后⼀⾏
python怎么读取dat文件本⽂的思想:如果把⽂件指针移动到靠后的位置,那么只要readlines⽅法返回的list的长度⼤于2,那么虽然list第⼀个元素读取的⾏可能不完整,但后⾯的元素读取的⾏肯定都是完整的了。⽽且考虑到了最后⼀⾏或多⾏是空⾏的情况。
代码:
import os
def get_last_line(inputfile):
filesize = size(inputfile)
blocksize = 1024
dat_file = open(inputfile, 'rb')
last_line = b""
lines = []
if filesize > blocksize:
maxseekpoint = (filesize // blocksize)#这⾥的除法取的是floor
maxseekpoint -= 1
dat_file.seek(maxseekpoint * blocksize)
lines = adlines()
while((len(lines)<2) | ((len(lines)>=2)&(lines[1]==b'\r\n'))):#因为在Windows下,所以是b'\r\n'
#如果列表长度⼩于2,或者虽然长度⼤于等于2,但第⼆个元素却还是空⾏
#如果跳出循环,那么lines长度⼤于等于2,且第⼆个元素肯定是完整的⾏
maxseekpoint -= 1
dat_file.seek(maxseekpoint * blocksize)
lines = adlines()
elif filesize:#⽂件⼤⼩不为空
dat_file.seek(0, 0)
lines = adlines()
if lines:#列表不为空
for i in range(len(lines)-1,-1,-1):
last_line = lines[i].strip()
if(last_line != b''):
break#已经到最后⼀个不是空⾏的
dat_file.close()
return last_line
#该函数返回的是bytes
last = get_last_line('新建⽂本⽂档.txt')
last = last.decode()
print(last)
你也可以通过本⽂的例⼦⽂本来进⾏测试,并将代码改成blocksize = 3 ,然后debug⽅式查看代码运⾏过程。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论