python篇---读取文件最后一行和从文件最后一行往上读取
三种方法
- #!/usr/bin/python
- # encoding: utf-8
- # -*- coding: utf8 -*-
- import os
-
-
- # 方法一:
- # Refer: http://www.pythonclub.org/python-files/last-line
- def get_last_line(inputfile):
- filesize = os.path.getsize(inputfile)
- blocksize = 1024
- dat_file = open(inputfile, 'rb')
- last_line = ""
- if filesize > blocksize:
- maxseekpoint = (filesize // blocksize)
- dat_file.seek((maxseekpoint - 1) * blocksize)
- elif filesize:
- # maxseekpoint = blocksize % filesize
- dat_file.seek(0, 0)
- lines = dat_file.readlines()
- if lines:
- last_line = lines[-1].strip()
- # print "last line : ", last_line
- dat_file.close()
- return last_line
-
-
- # 方法二:
- # Refer: http://code.activestate.com/recipes/578095/
- def print_first_last_line(inputfile):
- filesize = os.path.getsize(inputfile)
- blocksize = 1024
- dat_file = open(inputfile, 'rb')
- headers = dat_file.readline().strip()
- if filesize > blocksize:
- maxseekpoint = (filesize // blocksize)
- dat_file.seek(maxseekpoint * blocksize)
- elif filesize:
- maxseekpoint = blocksize % filesize
- dat_file.seek(maxseekpoint)
- lines = dat_file.readlines()
- if lines:
- last_line = lines[-1].strip()
- # print "first line : ", headers
- # print "last line : ", last_line
- return headers, last_line
-
-
- # 方法三:
- # My Implementation
- def get_file_last_line(inputfile):
- filesize = os.path.getsize(inputfile)
- blocksize = 1024
- with open(inputfile, 'rb') as f:
- last_line = ""
- if filesize > blocksize:
- maxseekpoint = (filesize // blocksize)
- f.seek((maxseekpoint - 1) * blocksize)
- elif filesize:
- f.seek(0, 0)
- lines = f.readlines()
- if lines:
- lineno = 1
- while last_line == "":
- last_line = lines[-lineno].strip()
- lineno += 1
- print(last_line)
- # return last_line
-
-
- # Test purpose
- # print(get_last_line("33011529001320014322.txt"))
- # print(print_first_last_line("33011529001320014322.txt"))
- print(get_file_last_line("33011529001320014322.txt"))
-
- #!/usr/bin/env python
- # -*-mode: python; coding: iso-8859-1 -*-
- #
- # Copyright (c) Peter Astrand <astrand@cendio.se>
-
- import os
-
-
- class BackwardsReader():
- """Read a file line by line, backwards"""
- BLKSIZE = 4096
-
- def __init__(self, file):
- self.file = file
- self.buf = ""
- self.file.seek(-1, 2)
- self.trailing_newline = 0
- lastchar = self.file.read(1)
- if lastchar == "\n":
- self.trailing_newline = 1
- self.file.seek(-1, 2)
-
- def readline(self):
- while 1:
- newline_pos = str.rfind(self.buf, "\n")
- print(newline_pos)
- pos = self.file.tell()
- if newline_pos != -1:
- # Found a newline
- line = self.buf[newline_pos+1:]
- self.buf = self.buf[:newline_pos]
- if pos != 0 or newline_pos != 0 or self.trailing_newline:
- line += "\n"
- return line
- else:
- if pos == 0:
- # Start-of-file
- return ""
- else:
- # Need to fill buffer
- toread = min(self.BLKSIZE, pos)
- self.file.seek(-toread, 1)
- self.buf = self.file.read(toread).decode('UTF-8') + self.buf
- self.file.seek(-toread, 1)
- if pos - toread == 0:
- self.buf = "\n" + self.buf
-
-
- if __name__ == "__main__":
- br = BackwardsReader(open('33011529001320014322.txt', "rb"))
- # fixme:可修改数值21达到从末尾网上读取多行的需求
- for i in range(21):
- print(br.readline())
-