Python读写Excel大数据文件的3种有效方式对比
作者:@Python大数据分析
有人问Python怎么处理大数据的Excel文件?
Python处理Excel大数据有很多方式,不过Excel撑死才104万行,能有多大的数据,一般用pandas读取就可以,pandas有专门的分块读取模式,比如说每次只读取1万行用于处理,这样就不会太占用内存。
pandas read_excel方法有专门的参数chunksize用于设置分块读取,代码示例如下:
import pandas as pd # 读取'test_data.xlsx'大文件 # 分块读取以减少内存占用 chunk_size = 10000 chunks = pd.read_excel('test_data.xlsx', chunksize=chunk_size) # 对每个数据块进行处理 processed_data = [] for i, chunk in enumerate(chunks): 这里代码是对每个数据块进行处理......
读取Excel能用pandas尽量用pandas,但如果Excel文件非常大,已经远大于内存容量了,或者你相对Excel有更多其他处理,比如修改格式等,则可以用OpenPyXL。
它有专门的流式读取方式(只读模式read-only mode)来处理Excel,底层原理是OpenPyXL不会加载整个Excel文件到内存,而是保存为一个逻辑对象,在用的时候才流式去读取它。
from openpyxl import load_workbook # 使用只读模式读取大型Excel文件 read_wb = load_workbook('large_data.xlsx', read_only=True) read_ws = read_wb.active # 以流式方式逐行读取、处理和写入 row_count = 0 for row in read_ws.iter_rows(min_row=2): 这里代码是对每一行进行处理......
OpenPyXL也可以流式写入Excel,原理同读取一样,采用write_only模式。
另外一个可以大规模写入数据,不占用内存的是库是XlsxWriter,它有个“常量内存”模式,支持每写入一行,就在内存中清除上一行占用的空间,意味着内存只存有一行数据,永远是够用的。
import xlsxwriter # 创建一个文件名,用于写入数据 file_name = 'large_data_constant_memory.xlsx' # 创建一个工作簿对象,并启用常量内存模式 workbook = xlsxwriter.Workbook(file_name, {'constant_memory': True}) worksheet = workbook.add_worksheet() 这里可以写入大量数据,不会占用内存......
除了以上几个库,还有像Dask、Polars、Modin、Rapids等库可以处理Excel大数据集,都是类似pandas的操作模式,但速度会快很多,可以试试。
方法补充
Python 处理大文件的 10 种方法
用 Python 处理大型文本文件可能会让人感到不知所措。当文件大小达到 GB 级时,尝试一次性将它们全部加载到内存中可能会导致程序崩溃。不过不用担心——Python 提供了多种策略来高效处理此类文件,而不会耗尽内存或性能。
1. 使用迭代器逐行读取
逐行读取文件可以确保每次只有一小部分内容加载到内存中。具体操作如下:
with open('large_file.txt', 'r') as file: for line in file: process(line) # Replace with your processing function
2. 分块阅读
有时,你需要比逐行读取更大的灵活性。以固定大小的块读取文件可以让你控制一次处理的数据量。
def read_file_in_chunks(file_path, chunk_size=1024): with open(file_path, 'r') as file: while True: chunk = file.read(chunk_size) if not chunk: break process(chunk) # Replace with your processing function
3.缓冲文件读取
缓冲读取通过以更大的内部块处理文件来提供更高级别的优化:
with open('large_file.txt', 'rb', buffering=10 * 1024 * 1024) as file: # 10 MB buffer for line in file: process(line)
为什么要使用它? 减少频繁磁盘 I/O 操作的开销。
4. 内存映射文件(mmap)
内存映射允许 Python 直接在内存中将文件视为字节数组。这彻底改变了随机访问的格局。
from mmap import mmap with open('large_file.txt', 'r') as file: with mmap(file.fileno(), length=0, access=mmap.ACCESS_READ) as mm: for line in mm: process(line.decode('utf-8'))
5. 使用生成器
生成器允许您延迟处理数据,仅加载必要的数据。
def generate_lines(file_path): with open(file_path, 'r') as file: for line in file: yield line for line in generate_lines('large_file.txt'): process(line)
为什么它很棒: 通过一次处理一行来减少内存使用量。
6. 批量处理线路
对于结构化文件,您可以一次处理多组行(或记录)。
def read_batches(file_path, batch_size=5): with open(file_path, 'r') as file: batch = [] for line in file: batch.append(line.strip()) if len(batch) == batch_size: yield batch batch = [] if batch: yield batch # Example usage: for batch in read_batches('cars.txt'): process_batch(batch) # Replace with your processing logic
适用于: CSV 或日志等结构化数据。
7.流处理
如果数据连续到达(例如日志或 API),请使用流处理。
import requests def stream_data(url): with requests.get(url, stream=True) as response: for line in response.iter_lines(): process(line)
用例: 实时日志监控或 API 数据流。
8. Dask 并行处理
对于海量数据集,可以考虑使用 Dask ,这是一个专为大数据并行计算而设计的库。
import dask.dataframe as dd df = dd.read_csv('large_dataset.csv') result = df[df['column'] > 100].compute()
为什么选择 Dask? 通过将内存不足的数据分块处理,可以更好地处理这些数据。
9. PySpark 用于分布式处理
如果您的数据大小超出了单台机器的容量,请使用 PySpark 进行分布式处理。
from pyspark.sql import SparkSession spark = SparkSession.builder.appName("LargeFileProcessing").getOrCreate() df = spark.read.csv('large_dataset.csv') df.filter(df['column'] > 100).show()
最适合: 需要集群级资源的大数据任务。
10. 特定格式的高效库
对于特定文件类型,使用优化库:
关于大文件处理的有趣事实
应避免的常见错误
加载整个文件: 除非文件很小,否则避免使用 file.readlines() 。
忘记缓冲: 使用缓冲 I/O 实现更流畅的性能。
忽略边缘情况: 始终处理诸如空行或无效格式之类的错误。
到此这篇关于Python读写Excel大数据文件的3种有效方式对比的文章就介绍到这了,更多相关Python读写Excel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!