def get_last_line(file_path, max_line_number, buffer_size=4096):

# 从末尾读取文件并返回以行组成的列表

"""

:param file_path: 文件路径

:param max_line_number: 返回行数

:param buffer_size: 读缓冲区大小

:return: :raise ParameterIllegal: 自定义错误

"""

if not isinstance(max_line_number, (int, long)):

raise ParameterIllegal('max line number not int')

if not isinstance(file_path, str):

raise ParameterIllegal('file_path value error')

if not isinstance(buffer_size, (int, long)):

raise ParameterIllegal('buffer_size not int')

if not os.path.exists(file_path):

raise ParameterIllegal('file_path not exists')

if buffer_size > 20000:

raise ParameterIllegal('buffer_size large then 20000')

# 限制最大读取行数

if max_line_number > 100:

max_line_number = 100

out_put_line_list = []

try:

# 非unix文件使用r方式打开读取长度会减少,直接以rb方式打开

f = open(file_path, 'rb', buffering=buffer_size)

except OSError:

raise ParameterIllegal('open file get os error')

except IOError:

raise ParameterIllegal('open file get io error')

# 文件大小

file_size = os.path.getsize(file_path)

if file_size == 0:

try:

f.close()

msg = 'closed file'

except OSError:

msg = 'close file os error'

except IOError:

msg = 'close file io error'

raise ParameterIllegal('file size is 0 %s' % msg)

# 当前位置,即开始读取的位置

if file_size < buffer_size:

start_read_pos = 0

buffer_size = file_size

else:

start_read_pos = file_size - 1 - buffer_size

# 实际读取的buffer大小

read_buffer_size = buffer_size

# 实际读取到的行数

read_line_num = 0

# 未满行的字符串

line_buffer = ''

# 全部读取大小

size_read = 0

while read_line_num < max_line_number:

# 已经是文件的最开始部位,设置退出

# 防止读取过多内容,限制为1M

size_read += read_buffer_size

if size_read >= 1048576:

try:

f.close()

msg = 'closed file'

except OSError:

msg = 'close file os error'

except IOError:

msg = 'close file io error'

try:

f.close()

except OSError:

raise ParameterIllegal('close file get os error')

except IOError:

raise ParameterIllegal('close file get io error')

raise ParameterIllegal('read file get string to much long %d, %s' % (size_read, msg))

# seek到读取位置

f.seek(start_read_pos)

# 读取文件

try:

string_buffer = f.read(read_buffer_size)

except OSError:

try:

f.close()

msg = 'closed file'

except OSError:

msg = 'close file os error'

except IOError:

msg = 'close file io error'

raise ParameterIllegal('read file get os error and %s' % msg)

except IOError:

try:

f.close()

msg = 'closed file'

except OSError:

msg = 'close file os error'

except IOError:

msg = 'close file io error'

raise ParameterIllegal('read file get io error and %s' % msg)

# 换行位置,默认为string_buffer的结尾

new_line_pos = read_buffer_size

# xrange倒序

for i in xrange(read_buffer_size - 1, -1, -1):

if string_buffer[i] == '\n':

# 切片添加

if len(line_buffer) > 0:

out_put_line_list.insert(0, string_buffer[i + 1: new_line_pos] + line_buffer)

line_buffer = ''

else:

if len(string_buffer[i + 1: new_line_pos]) > 0:

out_put_line_list.insert(0, string_buffer[i + 1: new_line_pos])

read_line_num += 1

new_line_pos = i

if read_line_num >= max_line_number:

break

# 已经到当前string buff的第一个字符串

if i == 0:

if new_line_pos > 0:

line_buffer = string_buffer[0: new_line_pos] + line_buffer

out_put_line_list.insert(0, line_buffer)

# 剩余文件长度大于buffer

if start_read_pos > buffer_size - 1: # 重新定位开始读取的位置

start_read_pos = start_read_pos - buffer_size

# 剩余文件长度小于buffer

else:

read_buffer_size = buffer_size - start_read_pos # 减少实际读取的buffer

start_read_pos = 0 # 读取位置定义到文件头

if read_line_num < max_line_number:

read_line_num = max_line_number - 1

if file_size < buffer_size:

read_line_num = max_line_number

try:

f.close()

except OSError:

raise ParameterIllegal('close file get os error')

except IOError:

raise ParameterIllegal('close file get io error')

return out_put_line_list

python文件内容倒序_python倒序读取文件tail方式相关推荐

  1. python中保存的文件怎么打开_python怎样读取文件 看完你学会了么

    python读取文件的方法有read(),readline(),readlines().今天咪咪我就来讲解一下python怎样读取文件. 工具/材料 电脑 python 3 vscode 操作方法 0 ...

  2. python读取文件并且排序_python 顺序读取文件夹下面的文件(自定义排序方式)...

    我们在读取文件夹下面的文件时,有时是希望能够按照相应的顺序来读取,但是 file_lists=os.listdir()返回的文件名不一定是顺序的,也就是说结果是不固定的.就比如读取下面这些文件,希望能 ...

  3. python中几种读取文件的方法_python 逐行读取文件的几种方法

    Python四种逐行读取文件内容的方法 下面四种Python逐行读取文件内容的方法, 分析了各种方法的优缺点及应用场景,以下代码在python3中测试通过, python2中运行部分代码已注释,稍加修 ...

  4. python遍历文件夹排序_python 顺序读取文件夹下面的文件(自定义排序方式)

    我们在读取文件夹下面的文件时,有时是希望能够按照相应的顺序来读取,但是 file_lists=os.listdir()返回的文件名不一定是顺序的,也就是说结果是不固定的.就比如读取下面这些文件,希望能 ...

  5. java 读取文件内容 实例_Java 实例 – 读取文件内容 - Java 基础教程

    Java 实例 以下实例演示了使用 readLine() 方法来读取文件 test.log 内容,其中 test.log 文件内容为: 本站 www.runoob.com java 代码如下: Mai ...

  6. js 读取php文件内容为空,PHP 读取文件内容代码(txt,js等)

    PHP 读取文件内容代码(txt,js等) 发布于 2014-10-15 20:15:37 | 128 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hyperte ...

  7. php文件读取文件内容,PHP文件系统函数-读取文件内容几种方式

    介绍几种php获取文件内容的方式 介绍读取文件的方式之前,我们先看一下打开文件资源和关闭资源 名字资源绑定到一个流 - fopen 关闭一个已打开的文件指针 - fclose $handle1 = f ...

  8. java读取http文件内容_使用HTTP读取文件的第一部分

    我想通过读取文件的第一部分并分析内容来确定文件的类型(通常为UTF-8).(该类型特定于我的社区,但不受我的控制,并且不受MIME / MediaType覆盖,通常为TEXT_PLAIN).我正在客户 ...

  9. php 读取pdf文件内容 显示乱码,PHP读取文件,解决中文乱码UTF-8的方法分析

    本文实例讲述了PHP读取文件,解决中文乱码UTF-8的方法.分享给大家供大家参考,具体如下: $opts = array( "file" => array( "en ...

  10. java读取文件的方法是_Java读取文件方法大全

    Java读取文件方法大全 2011/11/25 9:18:42  tohsj0806  http://tohsj0806.iteye.com  我要评论(0) 摘要:文章来源:http://www.c ...

最新文章

  1. github 与git 使用 及配置
  2. 网页热点区域神器工具大曝光
  3. db2 order by 利用索引
  4. python起步输入-Python 起飞系列————起步(一)
  5. 从头开始学习vue-router
  6. vagrant --- vagrant部署环境
  7. JAVA程序设计心得001
  8. python cpython关系_第3篇:CPython内部探究:PyASCIIObject的初始化
  9. Spark Java API:foreach、foreachPartition、lookup
  10. TestContainers和Spring Boot
  11. linux下查看进程的线程数,linux查看进程的线程数
  12. 决策者根据什么曲线做出决策_如何在开放社区中做出品牌决策
  13. 2021年甘肃省中职生高考成绩查询,甘肃2021年中专生怎么参加普通高考
  14. pg日期转周_PostgreSQL的时间/日期函数使用
  15. 字典、集合与字符串——Python基础语法
  16. python no such file or directory_Python3 no such file or directory
  17. QT5.9 for 安卓开发 环境配置
  18. 郎文词根mdx_欧陆词典导入mdx_欧路词典导入音频
  19. 科幻计算机类小说,短篇科幻小说推荐 | 黄金时代的五部科幻杰作
  20. excel 自定义宏所有excel可用

热门文章

  1. webstorm批量查找,批量替换快捷键
  2. 我的 5 年 Android 学习之路,那些年一起踩过的坑
  3. 转载——MinMax算法详解
  4. Python下安装Pywifi进行WiFi密码破解
  5. 如何制作RJ45超五类线缆?六个步骤搞定!
  6. 小波神经网络(时间序列预测)
  7. 单片机的串行通讯就是排成一队走,并行就是排成一列走
  8. 星罗棋布:关于VPS测试脚本集锦内容
  9. CADD之分子对接二:简单autodockvina对接流程——redocking
  10. 任正非最新讲话:18年华为没有1项原创发明