python3读取文件特定行的三种计划方案

文中根据4个检测经典案例了在python中读取文件特定行內容的计划方案,并获得了一些运作用时的数据信息。从要求上而言,如果是针对小规模纳税人的数据信息,例如好几百行经营规模的数据信息,提议应用readline循环系统遍历年来实际操作,速率也非常非常好,或是是linecache中的涵数完成也是能够 的,乃至能够 立即用readlines将全部文字內容载入到运行内存中。可是针对数据信息经营规模较为大的情景,例如超出了干万行的等级,那麼应用sed命令的方法对特定行內容开展载入的方法,应该是全部方法中最迅速的。

技术性情况

充分考虑深度神经网络行业中的数据信息经营规模一般都较为大,尤其是训练集,这一限定标准相匹配到具体程序编写中就代表着,大家很有可能没法将全部数据库文件的內容所有都载入到运行内存中。那麼就必须一些独特的处理方法,例如:建立内存映射文档来取代初始文档被载入到运行内存中、预备处理数据信息后再载入运行内存中及其一次只载入文档的精彩片段。在其中有关内存映射技术性的一些运用,在前面的这2篇blog1和blog2中有一定的详细介绍,而文中即将详细介绍的是以文档中只载入特殊行的內容的3种解决方法。

行解析xml完成

在python中假如要将一个文档彻底载入到运行内存中,根据file.readlines()就可以,可是在文档占有较高时,我们都是没法详细的将文档载入到运行内存中的,此刻就必须采用python的file.readline()开展迭代更新式的一行行载入:

filename = 'hello.txt'

with open(filename, 'r') as file:
    line = file.readline()
    counts = 1
    while line:
        if counts >= 50000000:
            break
        line = file.readline()
        counts  = 1

这儿大家的完成方法是先用一个with句子开启一个文档,随后用readline()涵数相互配合while循环系统一行行载入,最后根据一个编号标识来完毕循环系统解析xml,輸出文档第50000000行的內容。该编码的实行实际效果以下:

dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py 

real    0M10.359s
user    0M10.062s
sys     0M0.296s

能够 见到这儿的用时为10s多一些。

linecache完成

尽管在python的readline涵数中并沒有完成载入特定行內容的计划方案,可是在另一个库linecache中是完成了的,因为应用的方法比较简单,这儿立即放上编码实例仅供参考:

filename = 'hello.txt'

import linecache
text = linecache.getline(filename, 50000000)

该编码的实行結果以下:

dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py 

real    0M11.904s
user    0M5.672s
sys     0M6.231s

尽管在完成方法上简单化了很多,可是大家发觉这一完成的耗时超出了11s,还比不上我们自己手动式完成的循环系统解析xml计划方案。因而如果是针对特性有一定规定的情景,不是提议选用这一计划方案的。

cmdsed获得

我们知道用Linux系统软件自身内置的sed命令也是能够 获得到文档特定行或是是特定行范畴的数据信息的,其实行命令为:sed -n 50000001080 filename即表明读取文件的第50000000行的內容。另外融合python得话,我们可以在python编码中实行系统软件命令并获得輸出結果:

filename = 'hello.txt'

import os
result = 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.532s
user    0M0.032s
sys     0M0.020s

能够 见到立即应用sed命令的实行速率迅速,可是用这类方式 并并不是一本万利的,例如下列这一事例:

filename = 'hello.txt'

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

大家把载入第50000000行內容改成载入第500行的內容,再运行一次程序流程:

dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py 

real    0M2.540s
user    0M0.037s
sys     0M0.01三秒

殊不知大家发觉这一速率并沒有由于要载入的个数降低了而越来越少,只是基本上维持不会改变的。

汇总概述

文中根据4个检测经典案例了在python中读取文件特定行內容的计划方案,并获得了一些运作用时的数据信息。从要求上而言,如果是针对小规模纳税人的数据信息,例如好几百行经营规模的数据信息,提议应用readline循环系统遍历年来实际操作,速率也非常非常好,或是是linecache中的涵数完成也是能够 的,乃至能够 立即用readlines将全部文字內容载入到运行内存中。可是针对数据信息经营规模较为大的情景,例如超出了干万行的等级,那麼应用sed命令的方法对特定行內容开展载入的方法,应该是全部方法中最迅速的。

版权声明

文中先发连接为:https://www.cnblogs.com/dechinphy/p/lbl.html

创作者ID:DechinPhy

大量原著小说文章内容请参照:https://www.cnblogs.com/dechinphy/

打赏主播专用型连接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

腾讯云服务栏目同歩:https://cloud.tencent.com/developer/column/91958

评论(0条)

刀客源码 游客评论