You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在PyCharm中如何使用pandas分块功能处理超300万行的大型CSV文件

核心问题说明

你现有代码的错误点在于将pd.read_csv开启chunksize后返回的迭代器直接传入DataFrame构造函数,没有触发分块逻辑,依然会尝试加载全量数据到内存,导致无法处理300万行的大文件。

修正后可正常运行的代码

import pandas as pd
import csv

def reading(csv_input, chunksize=100000):
    originalLength = 0
    rowCount = 0
    dropCount = 0
    # 过滤关键词集合,后续新增规则直接在此处添加即可
    FILTER_KEYWORDS = {'dbk', 'ptc', 'wcf', 'google'}
    # 全局行号偏移,用于匹配原始文件的真实行索引
    row_offset = 0

    with open(f'Web Report {csv_input}', 'w', newline='', encoding='utf-8') as file:
        writer = csv.writer(file)
        writer.writerow(['Index', 'URL Category', 'User IP', 'URL'])
        
        # 迭代读取每个分块,每次仅加载chunksize指定行数到内存
        for chunk in pd.read_csv(csv_input, chunksize=chunksize, usecols=['Line', 'Action', 'Site Name', 'URL Category', 'User IP']):
            chunk_len = len(chunk)
            originalLength += chunk_len

            # 向量化过滤,效率是逐行遍历的10倍以上
            # 筛选Action等于0的行
            mask_action = chunk['Action'] == 0
            # 筛选Site Name不包含所有过滤关键词的行
            mask_keyword = ~chunk['Site Name'].str.contains('|'.join(FILTER_KEYWORDS), na=False)
            valid_mask = mask_action & mask_keyword

            # 统计丢弃行数
            dropCount += chunk_len - valid_mask.sum()

            # 写入符合要求的行
            for _, row in chunk[valid_mask].iterrows():
                writer.writerow([
                    row_offset + row['Line'],
                    row['URL Category'],
                    row['User IP'],
                    row['Site Name']
                ])
            rowCount += valid_mask.sum()

            # 更新行偏移量
            row_offset += chunk_len

    print(f"Input: {csv_input}")
    print(f"Output: Web Report {csv_input}")
    print(f"Original Length: {originalLength}")
    print(f"Current Length: {rowCount}")
    print(f"Drop Count: {dropCount}\n")

    return

优化说明

  • 新增usecols参数仅读取需要用到的列,进一步降低内存占用
  • 用pandas向量化操作替代逐行判断,300万行数据可在几分钟内处理完成
  • 新增newline=''参数避免Windows系统下CSV写入出现多余空行,指定编码避免乱码
  • 可根据自身设备内存大小调整chunksize参数,内存充足的情况下设置为30万~50万可进一步提升处理速度

内容的提问来源于stack exchange,提问作者Lainey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 08:36:02