首页 > 编程语言 >大文件读取的实现-PYTHON

大文件读取的实现-PYTHON

时间:2023-02-18 10:37:47浏览次数:40  
标签:文件 读取 PYTHON lines read file line open


当前一个大文件大小,比当前的机器的内存大,先读取某个文件里的一部分。

文件遍历

因为文件保存了很多字符和行,因此也是循环常见的典型使用案例,最原始的方法可以调用文件对象的read方法,把文件内容一次性加载至字符串对象

file = open('myfile.txt', 'r')
print(file.read())

hello text file
goodbyt text file
Hahahahah

或者for读取这样的文件:

for方法一、

with open(file) as f:
list_of_lines = f.readlines()

或者

for line in open('myfile.txt','r').readlines():
print(line, end='')

for方法二、

f = open(file)
for line in file:
#do something

第一种方法通过readlines方法,会首先一次性把文件载入到行字符串列表中,然后再对这个字符串列表进行迭代;
第二种方法运行的原理则有所不同,他并非一次性将全部的文件内容载入到内存中,而是在迭代的时候,循环到了哪一行才将哪一行读入到内存。这里涉及到一个新的概念----迭代器(open函数返回的那个就是文件迭代器)。

上面的方式都不适合或者不是最优解。

解决方案

您想要的是逐行读取文件,而忽略除某些行(例如,行[17,34))以外的所有行。

​enumerate​​遍历文件时,尝试使用跟踪行号。这是一种基于生成器的方法,该方法yield一次只输出一条有趣的行:

def read_only_lines(f, start, finish):
for ii,line in enumerate(f):
if ii>=start and ii<finish:
yield line
elif ii>=finish:
return

f = open("big text file.txt", "r")
for line in read_only_lines(f, 17, 34):
print line

此​​read_only_lines​​​函数基本上是​​itertools.islice​​从标准库重新实现的,因此您可以使用它来实现更紧凑的实现:

from itertools import islice
for line in islice(f, 17, 34):
print line

如果要在列表中而不是在生成器中捕获感兴趣的行,只需将它们转换为列表即可:

from itertools import islice
lines_of_interest = list( islice(f, 17, 34) )

do_something_awesome( lines_of_interest )
do_something_else( lines_of_interest )


标签:文件,读取,PYTHON,lines,read,file,line,open
From: https://blog.51cto.com/u_15967457/6065092

相关文章

  • python--石头剪刀布游戏(列表)
    一、学习目标利用列表实现石头剪刀布游戏二、实验环境Pycharm社区版、win11三、代码及运行结果先贴代码,有需要的直接拿,想要进一步一起学习的,接着往下看第四个标题呀,亲。起初......
  • PHP超低内存遍历目录文件和读取超大文件
    前言这篇笔记主要解决这么几个问题:PHP如何使用超低内存快速遍历数以万计的目录文件?PHP如何使用超低内存快速读取几百MB甚至是GB级文件?顺便解决哪天我忘了可以通过搜索引擎......
  • 局域网中linux和window共享文件方案——samba
    注明:曾经写过:局域网中如何为Ubuntu20.04和window10共享文件,本文可以视作为该篇的续篇。  ==========================================......
  • Portswigger 靶场之“文件上传”
    FileuploadvulnerabilitiesAlllabs|WebSecurityAcademy(portswigger.net)1.Remotecodeexecutionviawebshellupload通过Webshell上传远程执行代码......
  • python学习笔记七:DataFrame
    1.Series是ndarray的升级,而DataFrame是Series的升级,从一维拓展到多维DataFrame的属性:index,colums,values,shapeimportnumpyasnpimportpandasaspdfrompandasimport......
  • python学习笔记六:Series
    Series是一种类似于一维数组的对象,由以下两部分组成:values:一组数据(ndarray或list类型)index:相关的数据索引标签一维数组默认索引为0,1,2,3...,而Series的索引可以自己给定......
  • python学习笔记五:numpy
    ndarray是一个多维数组的数据结构1.彩色图像是一个三维数组,通过matplotlib显示图像#显示图像importnumpyasnpimportmatplotlib.pyplotaspltfish=plt.imread('HappyF......
  • opencv二:视频读取与保存
    1.打开摄像头#打开摄像头importcv2cap=cv2.VideoCapture(0)while(True):ret,frame=cap.read()#返回两个值,第一个为bool类型,如果读到帧返回True,如果没读到帧返回Fa......
  • opencv一:图像读取与保存
    如果不想每次在命令前加上cv2的话,可以将importcv2改为fromcv2import*图像读取函数:cv2.imread(图像路径,标志符)图像路劲可以是绝对路径和相对路径标识符有三种:cv2.IMREAD......
  • python学习笔记四:字典
    字典和集合一样是无序的,不能通过索引来存取,只能通过键来存取。字典的键必须是不可变的数据类型,如数字,字符串,元组等,列表等可变对象不能作为键。不允许同一个键出现两次,创建......