Python处理千万级csv大文件:使用多线程加快处理速度

CSV文件太大打不开进行分割、和打开乱码问题 CSV文件打开以及乱码问题 今天要使用一个csv文件,但是有8个G,excel打不开,用Python的pandas也读不了,可能是我电脑配置太落后,也可能是数据实在太大了。 解决办法:首先处理打不开的问题,我们可以把大的csv分割成若干小文件,使用文件分割器,按10000行一个文件分割,分割器在F:\新建文件夹\csv文件分割器\split.exe,稍等一段时间就行。我还试过另一个分割器,但是不行... 阅读详情
AI摘要

文章讲述了如何使用Python处理包含3600万条数据的大CSV文件,通过分割、多线程去重和合并操作,提高效率并确保数据准确性。作者介绍了如何利用chunk_size和多线程技术优化内存使用和运行速度。

一、思路

源数据文件有3600多万条数据,占内存3.73GB,数据量很大,一般方式肯定很难打开和操作。
大部分数据都不是需要用的,只有小部分数据需要,所以没有全部都需要打开进行操作的必要。
即使用分割工具进行分割,但由于数据量太大会需要分割太多个文件,一个个打开操作也不方便,还容易卡死。
所以最终还是选择使用python脚本实现,同时使用python的多线程方法提高运行速度。

整体需求如下:

  1. 分割CSV大文件为多个小文件:根据需要,将大文件分割成多个小文件。
  2. 读取并处理每个小CSV文件:读取每个小文件,对指定列进行去重操作。
  3. 合并小CSV文件:将处理后的小文件合并成一个大文件。
  4. 最终去重:在合并的大文件中,再次对指定列进行去重。
  5. 保存为Excel文件:将最终去重后的数据保存为Excel文件。

二、代码实现

import pandas as pd
import os
from concurrent.futures import ThreadPoolExecutor

# 指定工作目录
desired_dir = "C:\\Users\\18703\\Desktop\\merge_detail" #替换成自己的工作路径
os.chdir(desired_dir)
print("当前工作路径为:", os.getcwd())


# 现在当前工作目录已经改变为指定的目录


# 步骤1:分割CSV文件为多个小文件
def split_large_csv(input_file, output_folder, chunk_size):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    chunk_number = 0
    print("准备读取数据,开始分割大文件!")
    # 使用chunksize方法进行分割
    for chunk in pd.read_csv(input_file, chunksize=chunk_size, encoding='GB2312', low_memory=False):
        chunk.to_csv(os.path.join(output_folder, f'chunk_{chunk_number}.csv'), index=False, encoding='GB2312')
        chunk_number += 1
        print("已分割第%d个文件" % chunk_number)

# 步骤2:读取并处理每个小CSV文件
def process_and_deduplicate_chunk(chunk_path, output_folder):
    df = pd.read_csv(chunk_path, encoding='GB2312') # encoding根据自己文件的具体情况填写
    columns_to_deduplicate = ['主产品名称', '子产品名称', '播放时长占比(%)']
    df_extract = df[columns_to_deduplicate]
    df_deduplicated = df_extract.drop_duplicates(subset=columns_to_deduplicate, keep='first')
    output_path = os.path.join(desired_dir, output_folder, f'deduplicated_{os.path.basename(chunk_path)}')
    df_deduplicated.to_csv(output_path, index=False, encoding='GB2312')

# 步骤3:合并小CSV文件
def merge_deduplicated_chunks(input_folder, output_file):
    print("处理小文件完成,开始合并!")
    all_dfs = []
    for deduplicated_file in os.listdir(input_folder):
        if deduplicated_file.startswith('deduplicated_'):
            deduplicated_path = os.path.join(input_folder, deduplicated_file)
            df = pd.read_csv(deduplicated_path, encoding='GB2312')
            all_dfs.append(df)
    print("合并完成,开始处理合并后的文件!")
    combined_df = pd.concat(all_dfs, ignore_index=True)
    columns_to_deduplicate = ['主产品名称', '子产品名称', '播放时长占比(%)']
    final_df = combined_df.drop_duplicates(subset=columns_to_deduplicate, keep='first') #合并后再次去重
    print("处理合并文件结束!")
    final_df.to_excel(output_file, index=False, encoding='utf-8')

# 设置参数
input_csv_file = "merge_detail_202306.csv"  #源文件名称
output_split_folder = 'split_chunks'  #分割后存放小文件的文件夹名称
output_deduplicated_folder = 'deduplicated_chunks'  #处每个理小文件去重后存放的文件夹名称
final_output_excel = 'final_deduplicated_data.xlsx'  #存放最终处理结果的excel名称
chunk_size = 1000000  # 根据需求调整分割大小(看自己电脑情况,这里我不想分的太多)

if not os.path.exists(output_deduplicated_folder):
    os.makedirs(output_deduplicated_folder)

# 执行步骤1
split_large_csv(input_csv_file, output_split_folder, chunk_size)

# 执行步骤2 - 多线程处理
with ThreadPoolExecutor() as executor:
    print("开始处理每个小文件!")
    chunk_paths = [os.path.join(desired_dir, output_split_folder, chunk_file) for chunk_file in os.listdir(os.path.join(desired_dir, output_split_folder))]
    for chunk_path in chunk_paths:
        executor.submit(process_and_deduplicate_chunk(chunk_path, output_deduplicated_folder))

# 执行步骤3、4、5
merge_deduplicated_chunks(output_deduplicated_folder, final_output_excel)

print("处理完成!")

三、总结

  • 通过python使用chunk方法直接对大文件进行切割成多个小文件,不了解这个方法的可以参考前面的文章也有介绍:get_chunk方法
  • 对每个小文件去重后再合并在一起可能还会有重复值,所以需要再进行去重一次,这样才能保证最后结果的准确性
  • 使用python的多线程处理,可以大大加快处理速度,比不使用多线程方法要快很多,不过也要根据自己电脑性能具体情况而定
  • 最终得到的文件就比较小了,在excel里再进行透视等操作就方便多了
  • 把每一步骤打印出来,方便了解运行结果情况
使用python中的pandas对csv文件进行拆分 使用pandas高效切分大型csv文件 阅读详情

相关推荐

CSV大文件拆分技巧:如何快速分割大数据集

一键表格合并助手 首先,我要推荐一个非常实用的工具——一键表格合并助手。这款工具由“勤学道人”开发,特别适合小白用户。它拥有可视化界面,操作简单,只需选择表格文件后,一键转码即可。

m0_56280293的博客 1788

Python处理大数据,如何提高处理速度

Python处理大数据,如何提高处理速度

Natalie_Lv的博客 3575

CSV指南:使用Pandas库分割大型CSV文件

处理非常大的CSV文件时,直接操作整个文件可能会非常困难,特别是当文件大小超过了你的计算机内存时。一个常见的解决方案是将大文件分割成多个小文件,这样可以更容易地进行数据处理和分析。

qq_59629101的博客 3250

python使用pandas分块读取大csv文件并根据字段值分割

计算表格中两列的时间差

Procrastination的博客 668

CSV指南:Python程序获取大型CSV文件行数

本指南提供了几种使用Python来获取大型CSV文件行数的方法,并解释了每种方法的适用场景。

qq_59629101的博客 4073

CSV大文件大表格分割神器,效率提升利器!

以上几种方法各有优势,可以根据实际情况选择最适合自己的方法。如果你是新手,推荐使用一键CSV拆分分割助手;如果你熟悉编程,可以尝试使用Python或者VBA来分割大文件。通过以上几种工具和方法,你一定可以高效地分割大文件的CSV表格,提升工作效率。同时,欢迎关注我的账号,获取更多写作技巧!你还有哪些提升文章互动率的技巧?欢迎在评论区分享!

m0_56280293的博客 1024

Python 处理大文件技巧

设计合理的 I/O 策略控制内存峰值提升并发并行能力结合外部存储优化架构大文件处理,绝不仅仅是“写个循环”这么简单,而是考验架构能力和工程思维。

测试者家园 1331

Python读取CSV文件处理大数据

Python读取CSV文件处理大数据在数据分析和处理中,CSV(逗号分隔值)文件是常见的数据格式之一。Python提供了强大的工具和库来读取和处理CSV文件,这对于处理大数据非常有用。本文将介绍如何使用Python读取CSV文件,并对大数据进行处理。

CodeHeroicX的博客 844

Python处理CSV大文件特定行数据

通常处理csv大文件,需要从文件第一行开始遍历,遍历到指定行才开始进行相应的处理,如果能直接处理指定行数据以优化处理流程,这样可以提高执行效率。下面将举出常见的知识点提供参考。 1、获取csv行数 # 读取csv文件行数 with open("his.csv", 'r') as f: size = len(f.readlines()) print("CSV li...

destiny的专栏 3526

使用python中的Pandas库轻松完成千万级数据处理

当我们使用Pandas读取小量数据进行处理时,一般性能不是问题。但有时我们需要处理较大数据量,比如几个G的数据,数据量达到千万甚至上亿级别,这时我们在读数据时经常会出现因内存不足而导致程序崩溃的问题。

白话机器学习 6693

大文件CSV拆分分割工具教程:一步步教你轻松搞定

先,我要推荐一款由“勤学道人”开发的高性能一键合并工具——一键表格合并助手。这款工具特别适合小白用户,操作简单,只需选择表格文件后,一键转码即可完成合并。

m0_56280293的博客 1594

Python处理CSV文件的14个高效技巧

性能优化:对于大型数据集,优先考虑数据预处理和数据类型管理,避免不必要的内存负担。异常处理:在读取或写入CSV文件时,加入异常处理机制,确保程序的健壮性和可靠性。数据验证:在数据处理过程中,进行必要的数据验证,如检查数据完整性、格式一致性等,避免错误数据导致的后续分析问题。代码复用:将常用的数据处理逻辑封装成函数或类,提高代码的复用性和维护性。掌握了这些技巧,你已经能够在Python中熟练地处理CSV文件了。无论是简单的数据读写,还是复杂的分析任务,这些技能都将助你一臂之力。

weixin_53707653的博客 2013

如何快速拆分分割CSV大文件?这几个方法你必须知道!

在日常的数据处理工作中,我们经常会遇到需要拆分和分割大CSV文件的情况。无论是为了提高数据处理效率,还是为了让数据更易于管理,掌握几种有效的CSV文件拆分方法都是非常有必要的。接下来,我将分享几种快速拆分CSV大文件的实用方法,希望对你有所帮助。

m0_56280293的博客 1万+

Python 解析 CSV 超大文件的高效方法

处理超大 CSV 文件时,分块读取是一个简单而有效的解决方案。无论是使用 Python 标准库还是 Pandas,都可以轻松实现这一功能。此外,结合其他优化技巧,如生成器、压缩文件和多线程,可以进一步提升处理效率。通过本文介绍的方法,您可以轻松应对各种规模的 CSV 文件,无论是在开发还是生产环境中,都能保持良好的性能表现。```

2501_91229761的博客 510

MT6826SGT-STD-R绝对值编码器深度解析:精准控制+灵活编程

本文详细介绍MT品牌的高性能绝对值编码器——MT6826SGT-STD-R。:区别于传统增量式编码器,绝对值输出无需掉电归零,开机即获准确位置数据。的核心优势,结合应用场景与选型指南,为工程师提供一站式解决方案参考。MT6826SGT-STD-R是一款专为工业级精密控制设计的。该设备广泛应用于伺服系统、机器人关节校准、自动化产线等领域。:15bit分辨率实现细腻的位置反馈;:通过专用编写器可自定义多项关键参数;:优化电路设计,适应复杂电磁环境。

2501_93066786的博客 680

从零玩转显示屏:手把手教你用Arduino驱动SPI屏幕(附引脚定义图)

本文提供了一份详尽的Arduino驱动SPI屏幕的入门指南。从SPI接口的核心引脚定义(如DC、RESET)与RGB接口的区别讲起,手把手指导硬件连接与软件库配置,并最终通过一个天气显示器实战项目,帮助读者掌握驱动SPI屏幕、显示RGB色彩内容的核心技能。

weixin_29189987的博客 132

【Python】极致的大文件处理思路来啦

为了进行并行处理,我们将任务划分为子单元。它增加了程序处理的作业数量,减少了整体处理时间。例如,如果你正在处理一个大的CSV文件,你想修改一个单列。我们将把数据以数组的形式输入函数,它将根据可用的进程数量,一次并行处理多个值。这些进程是基于你的处理器内核的数量。在这篇文章中,我们将学习如何使用multiprocessing、joblib和tqdm Python包减少大文件的处理时间。这是一个简单的教程,可以适用于任何文件、数据库、图像、视频和音频。提示:以下是本篇文章正文内容,下面案例可供参考。

liaozp88的博客 839

Disk Drill 使用教程

Disk Drill只需单击几下,即可恢复USB闪存驱动器上已删除的数据,包括丢失的照片,文档和其他文件类型。Disk Drill是真正的多合一应用程序,可在Mac上恢复闪存驱动器。Disk Drill将自动应用最佳的笔式驱动器恢复算法来恢复Mac数据。 USB闪存驱动器是一种传输和存储信息的好方法,但是如果错误地丢失或删除了存储在其中的文件,会发生什么呢?当您需要Mac的闪存驱动器数据恢复软件时,Disk Drill是您的最佳选择。Disk Drill将扫描您的USB闪存驱动器(也称为笔式驱动器)并查找

zjj778899的博客 1万+

【Python】原来处理大文件也可以这么简单?

为了进行并行处理,我们将任务划分为子单元。它增加了程序处理的作业数量,减少了整体处理时间。例如,如果你正在处理一个大的CSV文件,你想修改一个单列。我们将把数据以数组的形式输入函数,它将根据可用的进程数量,一次并行处理多个值。这些进程是基于你的处理器内核的数量。在这篇文章中,我们将学习如何使用multiprocessing、joblib和tqdm Python包减少大文件的处理时间。这是一个简单的教程,可以适用于任何文件、数据库、图像、视频和音频。

liaozp88的博客 574

LibTV本地部署:AI漫剧创作完整解决方案与实战指南

如果你正在关注AI漫剧创作这个赛道,可能会发现一个有趣的现象:市面上的AI视频工具要么功能单一,要么云端服务昂贵且存在内容审核风险。而今天要介绍的LibTV本地部署方案,或许能为你打开一扇新的大门。 这个方案的核心是Seedance2.0与豆包AI的本地化集成,它真正解决的是创作者对内容自主权、成本控制和创作效率的三重需求。与红果、抖音等平台提供的标准化AI工具相比,本地部署意味着你可以完全掌控生成过程,不受平台规则限制,更重要的是——所有数据都在本地,不存在内容泄露风险。 1. 这篇文章真正要解决的问题

weixin_28745309的博客 528

SAP_MM模块库存概览俄罗斯报表简介

本文介绍了SAP MM模块中"库存概览俄罗斯报表"的功能与应用。该报表主要用于查看物料在不同库存地点和类型的库存情况,并满足俄罗斯当地法规要求。文章解释了"俄罗斯报表"可能指代本地化合规库存报表或客户自定义报表,详细说明了事务代码J3RFLVMOBVEDH的操作步骤,包括公司代码、物料编码、日期范围等查询条件,并解释了报表中各字段含义如期初期末库存数量与价值。最后强调在物料分类账处理完成后使用该报表可获得实际库存价值,为SAP用户提供了实用的库存管理参考。

我小时候很黑的博客 1092

一个简单且处理速度很快的Python csv转excel方法

因为业务需要,需要在Mac平台把csv转成excel,且excel在10万条到100万条之间。 如果在Windows下excel就能处理……但这是Mac。 最先用的方法是pandas里面的转excel,调用方法真简单,就是处理速度十分感人,我自己用的csv动不动十分钟起步,不知道其中经历了多少步的处理。 import pandas as pd import datetime def csv_to_xlsx_pd(sourcePath:str,savePath:str,encode='utf-8'):

iCheer的博客 4909

在SAP系统中,公司间关联交易(Intercompany Transactions)或内部往来主要有三种经典的实现模式。这些模式的选择取决于企业的业务复杂度、自动化需求以及对实时性的要求

SAP系统中公司间关联交易的三种实现模式分析:1)手工记账模式(FB60/FB70)适用于低频交易,灵活性高但易出错;2)SD/MM跨公司销售采购模式(VA01/VF01/ME21N)适用于真实业务流转,业务财务集成度高;3)自动清算模式(F.13/ICR)适合高频交易集团企业,支持实时自动对账。关键成功要素包括正确配置贸易伙伴字段、统驭科目及专用凭证类型。建议根据企业规模、业务复杂度及自动化需求选择合适模式,其中大型集团优先考虑自动对账方案以确保合并报表准确性。

金牌架构师 561
上一篇: 数仓建模过程——写指标
下一篇: VBA宏之自动抓取关键文字并填充到指定单元格
rubyw
博客等级 码龄7年 1528粉丝 234原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rubyw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值