首页 > 编程语言 >如何在Python中高效地读写大型文件?

如何在Python中高效地读写大型文件?

时间:2025-01-22 14:48:50浏览次数:1  
标签:文件 高效 Python 读写 file path line chunk size

大家好,我是 V 哥。上一篇给大家介绍如何使用 Python 进行文件读写操作的方法,问题来了,如何读写的是大型文件,有没有什么方法来提高效率呢,不要捉急,这一篇来聊聊如何在Python中高效地读写大型文件。

以下是在 Python 中高效读写大型文件的一些方法:

一、逐行读取大型文件

def read_large_file_line_by_line(file_path):
    with open(file_path, 'r') as file:
        for line in file:
            # 处理每一行的数据,这里仅打印
            print(line.strip())
  • with open(file_path, 'r') as file:使用 with 语句打开文件,确保文件在使用完毕后自动关闭。
  • for line in file:文件对象是可迭代的,逐行读取文件内容,避免一次性将整个文件读入内存,节省内存空间,适用于大型文本文件。

二、分块读取大型文件

def read_large_file_in_chunks(file_path, chunk_size=1024):
    with open(file_path, 'r') as file:
        while True:
            data = file.read(chunk_size)
            if not data:
                break
            # 处理读取到的数据块,这里仅打印
            print(data)
  • file.read(chunk_size):每次读取指定大小(chunk_size)的数据块,循环读取直到文件结束。
  • chunk_size 可以根据实际情况调整,一般根据文件大小和可用内存来选择合适的值。

三、使用 mmap 模块进行内存映射文件操作(适用于大文件)

import mmap

def read_large_file_with_mmap(file_path):
    with open(file_path, 'r') as file:
        with mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ) as mmap_obj:
            # 处理映射的数据,这里仅打印
            print(mmap_obj.readline())
  • mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ):将文件映射到内存中,实现文件的高效读写,fileno() 方法获取文件描述符。
  • 可以像操作字符串一样操作 mmap_obj,避免了频繁的文件 I/O 操作,提高性能。

四、使用 pandas 分块处理大型 CSV 文件(适用于 CSV 文件)

import pandas as pd

def read_large_csv_in_chunks(csv_file_path):
    chunk_size = 100000  # 每块的行数
    for chunk in pd.read_csv(csv_file_path, chunksize=chunk_size):
        # 处理数据块,这里仅打印
        print(chunk)
  • pd.read_csv(csv_file_path, chunksize=chunk_size):将 CSV 文件按块读取,chunksize 为每块的行数。
  • 可以对每个 chunk 进行数据处理,如数据清洗、分析等操作,避免一次性加载整个文件。

五、使用 numpy 分块处理大型二进制文件(适用于二进制文件)

import numpy as np

def read_large_binary_in_chunks(binary_file_path, chunk_size=1024):
    with open(binary_file_path, 'rb') as file:
        while True:
            data = np.fromfile(file, dtype=np.float32, count=chunk_size)
            if data.size == 0:
                break
            # 处理数据块,这里仅打印
            print(data)
  • np.fromfile(file, dtype=np.float32, count=chunk_size):从文件中读取二进制数据,dtype 为数据类型,count 为元素数量。
  • 可以根据文件的存储数据类型调整 dtype,按块读取二进制文件。

六、使用 itertools 模块进行迭代处理(适用于文本文件)

import itertools

def read_large_file_with_itertools(file_path, chunk_size=1024):
    with open(file_path, 'r') as file:
        for chunk in itertools.zip_longest(*[iter(file)]*chunk_size):
            chunk = [line.strip() for line in chunk if line]
            # 处理数据块,这里仅打印
            print(chunk)
  • itertools.zip_longest(*[iter(file)]*chunk_size):将文件迭代器分组,每组 chunk_size 行,方便分块处理。

七、使用 linecache 模块逐行读取大型文件(适用于文本文件)

import linecache

def read_large_file_with_linecache(file_path, line_number):
    line = linecache.getline(file_path, line_number)
    # 处理指定行的数据,这里仅打印
    print(line.strip())
  • linecache.getline(file_path, line_number):从文件中获取指定行的数据,适用于只需要读取文件中某些行的情况,避免读取整个文件。

最后

在处理大型文件时,根据文件类型和操作需求,可灵活使用上述方法,避免一次性将整个文件加载到内存中,从而提高程序的性能和稳定性。同时,可以结合不同的模块和函数,实现复杂的数据处理和分析任务。好了,赶快收藏起来吧,实际工作中你一定会用得到,关注威哥爱编程,学习Python你必成。

标签:文件,高效,Python,读写,file,path,line,chunk,size
From: https://www.cnblogs.com/wgjava/p/18685848

相关文章

  • 高效批量工作流导入及脚本上线,利用DolphinScheduler接口轻松实现
    实现了批量生成DolphinScheduler的任务,当导入时发现只能逐个导入,因此通过接口实现会更方便。DolphinScheduler接口文档DolphinScheduler是有接口文档的,地址是http://IP:12345/dolphinscheduler/swagger-ui/index.html?language=zh_CN&lang=cn不过这文档写的比较简略,自己需要......
  • Python和Python 3 的区别
    Python和Python3都是非常流行的编程语言,在开发中都有各自的优点和特点。以下是其中一些值得注意的区别:代码兼容性:Python2.x和Python3.x不兼容,这是最重要的区别之一。Python2.x是早期版本,而Python3.x是重大更新后的版本,并且不完全向后兼容。这意味着在迁移过程中,需......
  • Python多继承时子类如何调用指定父类
    在Python中,多继承是一种强大的特性,允许一个类同时继承多个父类的属性和方法。然而,当多个父类中存在同名方法时,子类需要明确调用哪个父类的方法。本文将详细介绍如何在多继承情况下,子类调用指定父类的方法。一、多继承的基本概念1.1多继承的定义多继承指一个类可以继承多个父类......
  • 抽取网易云音乐热门评论:html+css+python+js 音乐与灵魂的碰撞
    抽取网易云音乐热门评论:html+css+python+js音乐与灵魂的碰撞代码链接不说废话,上代码!!!get.py#get.pyimporturllib.requestimporturllib.errorimporturllib.parseimportjson#抓取网易云音乐指定url的热评defget_hotComments(id):url='https://music.163.......
  • 6. 马科维茨资产组合模型+AI金融智能体(DeepSeek-V3)识别政策意图方案(理论+Python实战
    目录0.承前1.幻方量化&DeepSeek1.1Whatis幻方量化1.2WhatisDeepSeek2.重写AI金融智能体函数3.汇总代码4.反思4.1不足之处4.2提升思路5.启后0.承前本篇博文是对上一篇文章,链接:5.马科维茨资产组合模型+AI金融智能体(qwen-max)+政策信息优化方案......
  • 抽取网易云音乐热门评论(附代码):html+css+python+js 音乐与灵魂的碰撞
    抽取网易云音乐热门评论:html+css+python+js音乐与灵魂的碰撞代码链接不说废话,上代码!!!get.py#get.pyimporturllib.requestimporturllib.errorimporturllib.parseimportjson#抓取网易云音乐指定url的热评defget_hotComments(id):url='https://musi......
  • python 读取word、pdf文件内容
    importdocx2txtimportfitzimportdocxfromdocx.oxmlimportparse_xmldefget_doc_content(filepath):"""获取word文本内容"""try:doc=docx.Document(filepath)content=[]forelementindoc.elem......
  • Markdown+LaTeX+C++| VS Code 搭建高效学习环境
    Markdown+\(\LaTeX\)+C++|VSCode搭建高效学习环境开始之前:创建一个文件夹作为你的工作区,确保它没有中文路径并且文件夹下的文件也不能用中文命名。在https://code.visualstudio.com/上下载并安装VisualStudioCode。确保你的电脑系统为Windows且版本在Windows7.0......
  • 使用Python3.8写的代码比Python3.10写的性能差吗?
    一般情况下,Python3.10的性能是要好于Python3.8的。那么是否意味着同等条件下,使用Python3.8写出来的代码要比Python3.10写出来的代码性能差呢?笔者曾经写过一个项目,项目一开始使用Python3.8。重构时,因为3.8不支持某些功能,一度将Python版本升到了Python3.10。升到3.10......
  • GoAccess : 高效开源的Web日志分析工具
    什么是GoAccessGoAccess是一款高效、开源的Web日志分析工具,专为快速解析和可视化Apache、Nginx等Web服务器的访问日志而设计。它通过命令行界面提供实时分析功能,能够生成详细的访问统计、访客排名、页面请求等关键信息,并支持将分析结果导出为HTML、JSON、CSV等多种格式。GoAccess......