鱼C论坛

 找回密码
 立即注册
查看: 159|回复: 2

[技术交流] 如何在Python中高效地读写大型文件?

[复制链接]
发表于 2025-3-10 11:55:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
上一篇给大家介绍如何使用 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):从文件中获取指定行的数据,适用于只需要读取文件中某些行的情况,避免读取整个文件。
最后
在处理大型文件时,根据文件类型和操作需求,可灵活使用上述方法,避免一次性将整个文件加载到内存中,从而提高程序的性能和稳定性。同时,可以结合不同的模块和函数,实现复杂的数据处理和分析任务。好了,赶快收藏起来吧,实际工作中你一定会用得到!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2025-3-10 11:55:42 | 显示全部楼层
如何在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())
  • 分块读取大型文件:
    按块尺寸读取文件内容,更加灵活和高效。
    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)
  • 使用 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())
  • 使用 pandas 分块处理大型 CSV 文件:
    Pandas库提供了方便的分块读取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)
  • 使用 numpy 分块处理大型二进制文件:
    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)
  • 使用 itertools 模块进行迭代处理:
    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(file, fillvalue='', chunksize=chunk_size):
                # 处理数据块,这里仅打印
                print(chunk)
  • 使用 linecache 模块逐行读取大型文件:
    适用于只需要读取文件中某些行的情况。
    import linecache
    
    def read_large_file_with_linecache(file_path, line_number):
        line = linecache.getline(file_path, line_number)
        # 处理指定行的数据,这里仅打印
        print(line.strip())


选择哪种方法取决于您的具体需求、文件大小和可用资源。根据文件类型与处理方式灵活应用这些技术,可以显著提高程序的性能和效率。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-3-19 10:12:01 | 显示全部楼层
666666666666666666666666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-2 02:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表