我的编程空间,编程开发者的网络收藏夹
学习永远不晚

三种方法Python读取文件指定行,来看看你用过没?

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

三种方法Python读取文件指定行,来看看你用过没?

在这里插入图片描述

1.行遍历实现

在python中如果要将一个文件完全加载到内存中,
通过file.readlines()即可,
但是在文件占用较高时,
我们是无法完整的将文件加载到内存中的,
这时候就需要用到python的file.readline()进行迭代式的逐行读取:

filename = 'hello.txt'##python学习交流扣扣qun:660193417with open(filename, 'r') as file:    line = file.readline()    counts = 1    while line:        if counts >= 50000000:            break        line = file.readline()        counts += 1

这里我们的实现方式是先用一个with语句打开一个文件,
然后用readline()函数配合while循环逐行加载,
最终通过一个序号标记来结束循环遍历,
输出文件第50000000行的内容。
该代码的执行效果如下:

dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py real    0m10.359suser    0m10.062ssys     0m0.296s

可以看到这里的耗时为10s多一些。


2.linecache实现

虽然在python的readline函数中
并没有实现读取指定行内容的方案,
但是在另一个库linecache中是实现了的,
由于使用的方式较为简单,
这里直接放上代码示例供参考:

filename = 'hello.txt'import linecachetext = linecache.getline(filename, 50000000)

该代码的执行结果如下:

dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py real    0m11.904suser    0m5.672ssys     0m6.231s

虽然在实现方式上简化了许多,但是我们发现这个实现的用时超过了11s,还不如我们自己手动实现的循环遍历方案。因此如果是对于性能有一定要求的场景,是不建议采用这个方案的。


在这里插入图片描述

3.命令行sed获取

我们知道用Linux系统本身自带的sed指令
也是可以获取到文件指定行或者是指定行范围的数据的,
其执行指令为:
sed -n 50000000p filename即表示读取文件的第50000000行的内容。
同时结合python的话,
我们可以在python代码中执行系统指令并获取输出结果:

filename = 'hello.txt'import osresult = os.popen('sed -n {}p {}'.format(50000000, filename)).read()

需要注意的是,
如果直接运行os.system()是没有返回值的,
只有os.popen()是有返回值的,
并且需要在尾巴加上一个read()的选项。
该代码的执行结果如下:

dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py real    0m2.532suser    0m0.032ssys     0m0.020s

可以看到直接使用sed指令的执行速度很快,
但是用这种方法并不是一本万利的,
比如以下这个例子:

filename = 'hello.txt'import osresult = os.popen('sed -n {}p {}'.format(500, filename)).read()

我们把读取第50000000行内容改为读取第500行的内容,
再运行一次程序:

dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py real    0m2.540suser    0m0.037ssys     0m0.013s

然而我们发现这个速度并没有因为要读取的行数减少了而变少,而是几乎保持不变的。


4.总结

本文通过4个测试案例分析了在python中读取文件指定行内容的方案,
并得到了一些运行耗时的数据。
从需求上来说,

如果是对于小规模的数据,
比如几百行规模的数据,
建议使用readline循环遍历来操作,
速度也相当不错,
或者是linecache中的函数实现也是可以的,
甚至可以直接用readlines将整个文本内容加载到内存中。

但是对于数据规模比较大的场景,
比如超过了千万行的级别,
那么使用sed指令的方式对指定行内容进行读取的方式,
应该是所有方式中最快速的。

在这里插入图片描述

来源地址:https://blog.csdn.net/m0_74872863/article/details/129699464

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

三种方法Python读取文件指定行,来看看你用过没?

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python3读取文件指定行的三种方法

目录行遍历实现linecache实现命令行sed获取总结概要行遍历实现在python中如果要将一个文件完全加载到内存中,通过file.readlines()即可,但是在文件占用较高时,我们是无法完整的将文件加载到内存中的,这时候就需要用到p
2022-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录