当前位置:首页 > 科技  > 软件

超实用Python小技巧,轻松应对大文件

来源: 责编: 时间:2024-02-02 09:23:00 303观看
导读Python在文件处理方面提供了非常强大的支持,然而,当处理大型文件时,标准的文件处理技术会导致高内存使用,进而影响处理效率。在数据分析、机器学习以及系统管理等领域,经常需要打开和处理大型文件,以下是一些常见的用例:数据

Python在文件处理方面提供了非常强大的支持,然而,当处理大型文件时,标准的文件处理技术会导致高内存使用,进而影响处理效率。在数据分析、机器学习以及系统管理等领域,经常需要打开和处理大型文件,以下是一些常见的用例:kpx28资讯网——每日最新资讯28at.com

  • 数据分析和机器学习: 在这些领域中,常常需要处理大型数据集。例如,我们可能需要处理一个多GB的日志文件,或者处理用于训练机器学习模型的大型CSV文件。由于这些文件非常庞大,直接将其全部加载到内存中是不可行的。因此,需要有效地打开和处理这些文件,通常可以采用分块或按行读取文件的方式,以适应内存限制。
  • 文本处理: 如果处理大型文本文件,例如一本书、一批网页备份或大量客户评论,则需要先将这些文件打开,才能对其进行搜索、替换或计数等操作。
  • 日志分析: 系统管理员经常需要处理大型服务器日志文件来诊断问题、监视系统性能或分析用户行为。由于Python具有强大的文本处理能力,因此可以成为日志分析工作的优秀工具。

本文介绍如何在Python中有效地处理大型文件,确保数据的高效和安全管理。kpx28资讯网——每日最新资讯28at.com

1 使用with语句

在Python中,with语句提供了一种干净且高效的文件处理方式。with语句管理可以自动管理文件的打开和关闭操作,即使在with块内发生异常也能确保文件正确关闭,这样减少了文件泄漏的风险。如果文件在使用后未正确关闭,就可能会导致文件泄漏。因此,在处理文件时,推荐使用with语句来保障文件的正确处理和资源的释放。kpx28资讯网——每日最新资讯28at.com

with open('large_file.txt', 'r') as file:    for line in file:        print(line)

使用with语句时,不需要显式地关闭文件;当with块中的代码执行完毕,程序会自动关闭文件。这种方式可以减少由于忘记关闭文件造成的文件泄漏风险。kpx28资讯网——每日最新资讯28at.com

在上面的代码示例中,使用with语句打开一个文件并按行迭代。通过在for循环中使用文件对象来逐行读取文件。这种方式可以避免在处理大型文件时出现内存问题。kpx28资讯网——每日最新资讯28at.com

当调用open函数时,会返回一个文件对象,这个文件对象被分配给with语句中的变量file。在with块内,可以使用for循环来逐行读取文件。kpx28资讯网——每日最新资讯28at.com

当文件对象被迭代时,Python会为每次迭代调用文件对象的__next__()方法。这个方法读取并返回文件中的下一行,每次调用它时都会这样做。如果文件中没有更多的行,则__next__()方法会引发StopIteration异常,会告诉for循环停止迭代。例如:kpx28资讯网——每日最新资讯28at.com

class SimpleFile():    def __init__(self, data):        self.data = data.splitlines()        self.index = -1    def __iter__(self):        return self    def __next__(self):        self.index += 1        if self.index < len(self.data):            return self.data[self.index]        else:            raise StopIterationdata = "line 1/nline 2/nline 3/nline4"my_file = SimpleFile(data)while True:    print(next(my_file))

运行上面的代码,会看到以下输出:kpx28资讯网——每日最新资讯28at.com

line 1line 2line 3line4Traceback (most recent call last):  File "/mnt/efs/awside/data/home/lxu1/code/tony/python-code/file_opener.py", line 21, in     print(next(my_file))          ^^^^^^^^^^^^^  File "/mnt/efs/awside/data/home/lxu1/code/tony/python-code/file_opener.py", line 14, in __next__    raise StopIterationStopIteration

2 惰性加载文件

在处理大型文件时,不建议一次性将整个文件加载到内存中,因为这会消耗大量的内存资源,可能导致程序崩溃或系统假死。相反,应该采用惰性加载的方法,分块或按行读取文件。这种方法可以减少内存的使用量,提高程序的性能和稳定性。kpx28资讯网——每日最新资讯28at.com

惰性加载的原理是,只有在需要处理某一部分数据时,才会将其加载到内存中,这样可以最大限度地节省内存资源。kpx28资讯网——每日最新资讯28at.com

with open('large_file.txt', 'r') as file:    while True:        line = file.readline()        if not line:            break         print(line)# Or with the walrus operator with open('large_file.txt', 'r') as file:    while line := file.readline():        print(line)

在Python中,readline()方法用于从文件中读取单行。以下是此方法的简要概述:kpx28资讯网——每日最新资讯28at.com

  • 当调用时,它读取文件的下一行并将其作为字符串返回。
  • 如果在文件中存在,则返回的字符串会包含换行符/n。
  • 如果再次调用该方法,会读取下一行。
  • 当达到文件末尾时,readline()将返回空字符串。

在上面的代码示例中,程序按行读取文件并打印每一行内容。这种方法是通过逐行或分块读取文件的内容来提高处理大型文件的性能,而不是一次性将整个文件加载到内存中。程序会不断读取并打印文件中的行,直到到达文件末尾时,循环才会中断并结束执行。这种方法可以大幅减少内存的使用量,提高程序的性能和稳定性。kpx28资讯网——每日最新资讯28at.com

3 使用生成器

生成器是特殊的迭代器,可让开发者遍历大型文件且无需一次性加载整个文件到内存中。生成器通过生成一行一行的数据来保持其状态,非常适合用于处理大型数据集。例如:kpx28资讯网——每日最新资讯28at.com

def read_large_file(file_object):    while True:        data = file_object.readline()        if not data:            break        yield datawith open('large_file.txt', 'r') as file:    gen = read_large_file(file)    for line in gen:        print(line)

在上面的代码中:kpx28资讯网——每日最新资讯28at.com

  • yield data:如果有数据,则函数生成它。这使函数成为Python中的生成器,生成器是特殊类型的函数,会生成一系列结果,而不是单个值。
  • gen = read/_large/_file(file):通过调用带有文件对象的read_large_file()函数,可以创建一个生成器对象。
  • for line in gen:这会循环迭代生成器(从文件中逐行生成)。

4 分块读取文件

以分块的方式读取大型文件是Python处理大型文件的常见技巧。这种方法允许逐一处理文件的一部分,减少内存使用量。kpx28资讯网——每日最新资讯28at.com

chunk_size = 1024  # 每次迭代读取1024个字节with open('large_file.txt', 'r') as file:    while True:        chunk = file.read(chunk_size)        if not chunk:  #  如果该块为空,则表示已经到达文件末尾            break        print(chunk)

5 使用外部库

对于非常大型的文件或复杂的数据处理,建议使用像Pandas或Dask这样的库。这些库不仅提供高效的数据结构来进行数据操作,还提供了处理超出内存限制的数据集的功能。kpx28资讯网——每日最新资讯28at.com

以下是使用Pandas读取大型CSV文件的示例:kpx28资讯网——每日最新资讯28at.com

import pandas as pdchunk_size = 500 chunks = []for chunk in pd.read_csv('large_file.csv', chunksize=chunk_size):    chunks.append(chunk)df = pd.concat(chunks, axis=0)

在这个示例中,pd.read/_csv()函数每次读取500行,并返回包含这些行的DataFrame,然后可以分别进行处理。kpx28资讯网——每日最新资讯28at.com

6 总结

处理大型文件的高效方法在Python编程中是必不可少的技能,尤其是在数据分析、机器学习和系统管理等领域。kpx28资讯网——每日最新资讯28at.com

通过理解和应用最佳实践,例如使用with语句自动管理文件、懒惰加载或分块读取文件、发挥生成器的功能、避免不必要的引用以及利用像Pandas这样的外部库,可以确保Python程序高效、稳健,并且能够轻松处理大型数据集。kpx28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-71456-0.html超实用Python小技巧,轻松应对大文件

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 队列与栈的巅峰对决:Python中如何用栈实现队列?

下一篇: FPGA设计中的挑战和可靠解决方案

标签:
  • 热门焦点
  • 一加Ace2 Pro真机揭晓 钛空灰配色质感拉满

    终于,在经过了几波预热之后,一加Ace2 Pro的外观真机图在网上出现了。还是博主数码闲聊站曝光的,这次的外观设计还是延续了一加11的方案,只是细节上有了调整,例如新加入了钛空灰
  • 在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • 重估百度丨“晚熟”的百度云,能等到春天吗?

    &copy;自象限原创作者|程心排版|王喻可2016年7月13日,百度云计算战略发布会在北京举行,宣告着百度智能云的正式启程。彼时的会场座无虚席,甚至排队排到了门外,在场的所有人几乎都
  • 慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己&ldquo;当家&rdquo;的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • 三星Galaxy Z Fold5官方渲染图曝光:13.4mm折叠厚度依旧感人

    据官方此前宣布,三星将于7月26日在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy Z Flip 5、
  • iQOO 11S屏幕细节公布:首发三星2K E6全感屏 安卓最好的直屏手机

    日前iQOO手机官方宣布,新一代电竞旗舰iQOO 11S将会在7月4日19:00正式与大家见面。随着发布时间的日益临近,官方关于该机的预热也更加密集,截至目前已
  • “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主&ldquo;七王&rdquo;在群里介绍一些刷单赚
Top