文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-11-30 01:30

关注

本文介绍如何在Python中有效地处理大型文件,确保数据的高效和安全管理。

1 使用with语句

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

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

使用with语句时,不需要显式地关闭文件;当with块中的代码执行完毕,程序会自动关闭文件。这种方式可以减少由于忘记关闭文件造成的文件泄漏风险。

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

当调用open函数时,会返回一个文件对象,这个文件对象被分配给with语句中的变量file。在with块内,可以使用for循环来逐行读取文件。

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

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 StopIteration

data = "line 1\nline 2\nline 3\nline4"

my_file = SimpleFile(data)

while True:
    print(next(my_file))

运行上面的代码,会看到以下输出:

line 1
line 2
line 3
line4
Traceback (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 StopIteration
StopIteration

2 惰性加载文件

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

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

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()方法用于从文件中读取单行。以下是此方法的简要概述:

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

3 使用生成器

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

def read_large_file(file_object):
    while True:
        data = file_object.readline()
        if not data:
            break
        yield data

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

在上面的代码中:

4 分块读取文件

以分块的方式读取大型文件是Python处理大型文件的常见技巧。这种方法允许逐一处理文件的一部分,减少内存使用量。

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这样的库。这些库不仅提供高效的数据结构来进行数据操作,还提供了处理超出内存限制的数据集的功能。

以下是使用Pandas读取大型CSV文件的示例:

import pandas as pd

chunk_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,然后可以分别进行处理。

6 总结

处理大型文件的高效方法在Python编程中是必不可少的技能,尤其是在数据分析、机器学习和系统管理等领域。

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

来源:Python学研大本营内容投诉

免责声明:

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯