【Python】向Excel写入大数据量时

在Python中向Excel写入大量数据时,需要注意内存管理,因为一次性将整个数据集加载到内存可能会消耗大量资源,甚至导致程序崩溃。以下是几种处理大数据集并将其写入Excel文件的方法:

1. 分块写入(Chunking)

使用Pandas的ExcelWriterto_excel结合分块写入,可以有效地管理内存使用:

import pandas as pd

# 假设df是你的大数据量DataFrame
chunk_size = 10000  # 定义每个数据块的大小

# 使用ExcelWriter打开一个Excel文件
with pd.ExcelWriter('large_dataset.xlsx', engine='openpyxl') as writer:
    for start in range(0, len(df), chunk_size):
        end = min(start + chunk_size, len(df))
        chunk = df.iloc[start:end]
        chunk.to_excel(writer, sheet_name=f'Sheet_{start//chunk_size}', index=False)

2. 使用多个工作簿(Multiple Workbooks)

如果数据集非常大,可以考虑将数据分散到多个Excel文件中:

import os
import pandas as pd

chunk_size = 50000  # 每个文件的数据量
files_count = len(df) // chunk_size + 1

for i in range(files_count):
    start = i * chunk_size
    end = min((i + 1) * chunk_size, len(df))
    chunk = df.iloc[start:end]
    chunk.to_excel(f'data_chunk_{i+1}.xlsx', engine='openpyxl', index=False)

3. 优化数据类型(Optimizing Data Types)

在写入之前,优化DataFrame中的数据类型可以减少内存占用:

for col in df.columns:
    if df[col].dtype == 'object':
        # 尝试将object类型转换为category,如果适用
        df[col] = pd.Categorical(df[col])
    # 还可以尝试将int64转换为int32,float64转换为float32等

4. 使用数据库

对于非常大的数据集,使用数据库(如SQLite)作为中间存储可能更有效:

import sqlite3
import pandas as pd

# 将数据写入SQLite数据库
conn = sqlite3.connect('large_dataset.db')
df.to_sql('data_table', conn, if_exists='replace', index=False)

# 从数据库中查询并写入Excel
query = "SELECT * FROM data_table"
chunks = pd.read_sql_query(query, conn, chunksize=10000)

with pd.ExcelWriter('large_dataset.xlsx', engine='openpyxl') as writer:
    for chunk in chunks:
        chunk.to_excel(writer, sheet_name=f'Sheet_{chunks._index[i]}', index=False)

5. 使用xlsxwriter引擎

xlsxwriter引擎在写入大数据量时可能更有效,因为它在写入时不将整个DataFrame加载到内存中:

import pandas as pd

# 创建一个新的ExcelWriter对象指定xlsxwriter引擎
with pd.ExcelWriter('large_dataset.xlsx', engine='xlsxwriter') as writer:
    df.to_excel(writer, sheet_name='Sheet1', index=False)

请注意,使用xlsxwriter时,DataFrame需要一次性写入,但它在写入大数据集时通常更高效。

注意事项

  • 确保安装了所需的库,如openpyxlxlsxwriter
  • 根据你的数据特性和需求选择合适的方法。
  • 在写入之前,考虑对数据进行预处理,比如过滤、聚合或转换数据类型,以减少写入的数据量。
  • 测试不同的设置以找到最佳的性能平衡点。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容