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

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

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

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

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

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

1 使用with语句

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

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

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

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

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

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

运行上面的代码,会看到以下输出:ECb28资讯网——每日最新资讯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 惰性加载文件

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

惰性加载的原理是,只有在需要处理某一部分数据时,才会将其加载到内存中,这样可以最大限度地节省内存资源。ECb28资讯网——每日最新资讯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()方法用于从文件中读取单行。以下是此方法的简要概述:ECb28资讯网——每日最新资讯28at.com

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

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

3 使用生成器

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

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

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

4 分块读取文件

以分块的方式读取大型文件是Python处理大型文件的常见技巧。这种方法允许逐一处理文件的一部分,减少内存使用量。ECb28资讯网——每日最新资讯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这样的库。这些库不仅提供高效的数据结构来进行数据操作,还提供了处理超出内存限制的数据集的功能。ECb28资讯网——每日最新资讯28at.com

以下是使用Pandas读取大型CSV文件的示例:ECb28资讯网——每日最新资讯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,然后可以分别进行处理。ECb28资讯网——每日最新资讯28at.com

6 总结

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

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

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

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

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

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

标签:
  • 热门焦点
  • K60至尊版刚预热 一加Ace2 Pro正面硬刚

    Redmi这边刚如火如荼的宣传了K60 Ultra的各种技术和硬件配置,作为竞品的一加也坐不住了。一加中国区总裁李杰发布了两条微博,表示在自家的一加Ace2上早就已经采用了和PixelWo
  • 小米官宣:2023年上半年出货量中国第一!

    今日早间,小米电视官方微博带来消息,称2023年小米电视上半年出货量达到了中国第一,同时还表示小米电视的巨屏风暴即将开始。“公布一个好消息2023年#小米电视上半年出货量中国
  • 影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 摸鱼心法第一章——和配置文件说拜拜

    为了能摸鱼我们团队做了容器化,但是带来的问题是服务配置文件很麻烦,然后大家在群里进行了“亲切友好”的沟通图片图片图片图片对比就对比,简单对比下独立配置中心和k8s作为配
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 一篇文章带你了解 CSS 属性选择器

    属性选择器对带有指定属性的 HTML 元素设置样式。可以为拥有指定属性的 HTML 元素设置样式,而不仅限于 class 和 id 属性。一、了解属性选择器CSS属性选择器提供了一种简单而
  • 慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主&ldquo;七王&rdquo;在群里介绍一些刷单赚
  • 利用职权私自解除被封帐号 Meta开除20多名员工

    11月18日消息,据外媒援引知情人士表示,过去一年时间内,Facebook母公司Meta解雇或处罚了20多名员工以及合同工,指控这些人通过内部系统以不当方式重置用户帐号,其
Top