影刀RPA进阶教程_CSV大文件处理方案十万行数据的高效读写与内存管理
影刀RPA进阶教程CSV大文件处理方案十万行数据的高效读写与内存管理你做电商数据采集每天跑出来一个CSV文件。一开始几千行Excel打开秒开。上了几个月后文件长到了十万行。Excel打开要等30秒保存要一分钟。再往后文件超过一百万行——Excel直接告诉你文件太大无法完全加载。这时候你需要换一种思路来处理数据。Excel的极限在哪里Excelxlsx格式的单sheet上限是1,048,576行 × 16,384列。但实际使用中超过10万行后操作就明显变慢超过50万行基本上动一下卡一下。而CSV纯文本格式没有这个限制——它就是一个文本文件文件有多大取决于你的硬盘有多大。关键认知CSV文件超过10万行后不要再用Excel打开处理改用Python/pandas直接读写。为什么用pandas处理大CSVpandas处理CSV有三个优势分块读取不用一次性把整个文件加载到内存每次读5万行处理完再读下5万行列筛选可以只读取需要的列不用加载全部数据类型优化可以指定每列的数据类型节省内存一个100MB的CSVpandas可能只用30MB内存就读完了。而Excel打开同一个文件可能消耗1GB。实战一分块读取并处理店群矩阵自动化突破运营极限假设你有一个200万行的订单CSV需要筛选出状态为已发货的记录。一次性读完内存可能不够但分块读毫无压力importpandasaspd# 分块大小每次读5万行chunk_size50000output_file已发货订单.csvfirst_chunkTrue# 分块读取forchunkinpd.read_csv(orders.csv,chunksizechunk_size):# 筛选当前块filteredchunk[chunk[状态]已发货]# 写入第一个块写表头后续追加iffirst_chunk:filtered.to_csv(output_file,indexFalse,modew)first_chunkFalseelse:filtered.to_csv(output_file,indexFalse,modea,headerFalse)print(f已处理{len(chunk)}行筛选出{len(filtered)}行)print(处理完成)chunksize是核心参数。50,000是一个比较安全的数字大多数机器的内存扛得住可以根据你的机器内存调整。实战二只读取需要的列你的CSV有50个列但你只需要其中3个# 错误做法全部加载浪费内存dfpd.read_csv(orders.csv)# 500MBdfdf[[订单号,金额,状态]]# 正确做法只加载需要的列dfpd.read_csv(orders.csv,usecols[订单号,金额,状态])# 可能只需要30MBusecols参数在文件头部解析阶段就跳过了不需要的列内存节省是数量级的。实战三优化数据类型减少内存pandas默认给每列一个宽松的数据类型但这很浪费内存。# 先看看自动分配的类型有多浪费dfpd.read_csv(orders.csv,nrows10000)print(df.dtypes)print(f内存占用:{df.memory_usage(deepTrue).sum()/1024/1024:.2f}MB)# 手动指定类型dtype_dict{订单号:string,# 不用int64可能溢出金额:float32,# 不用float64精度够用数量:int16,# 不用int64数量不会超过32767状态:category,# 枚举值用category大幅节省创建时间:string,# 后面再转datetime备注:string}df_optimizedpd.read_csv(orders.csv,dtypedtype_dict)print(f优化后内存:{df_optimized.memory_usage(deepTrue).sum()/1024/1024:.2f}MB)一个常见的实际案例400MB的CSV优化后降到60MB。特别是status这种枚举列只有几个取值用category类型能节省90%的内存。实战四CSV到Excel分批转换有时候你需要把大CSV转成xlsx给别人——毕竟不是所有人都会操作CSV。但百万行直接转xlsx不行Excel上限104万行。方案按指定行数分sheetimportpandasaspd max_rows_per_sheet500000# 每个sheet最多50万行chunk_size50000sheet_index0total_rows0buffer[]forchunkinpd.read_csv(large.csv,chunksizechunk_size):buffer.append(chunk)total_rowslen(chunk)iftotal_rowsmax_rows_per_sheet:# 合并buffer写入一个sheetsheet_datapd.concat(buffer)sheet_namefSheet{sheet_index1}ifsheet_index0:sheet_data.to_excel(output.xlsx,sheet_namesheet_name,indexFalse)else:withpd.ExcelWriter(output.xlsx,modea,engineopenpyxl)aswriter:sheet_data.to_excel(writer,sheet_namesheet_name,indexFalse)# 重置buffer[]total_rows0sheet_index1print(f已写入{sheet_name})# 处理剩余数据ifbuffer:sheet_datapd.concat(buffer)withpd.ExcelWriter(output.xlsx,modea,engineopenpyxl)aswriter:sheet_data.to_excel(writer,sheet_namefSheet{sheet_index1},indexFalse)print(f已写入最后一个sheet共{sheet_index1}个sheet)print(全部完成)实战五CSV去重内存友好版百万行数据去重直接drop_duplicates()内存不够怎么办方案分块排序去重importpandasaspdimporthashlibdefdeduplicate_large_csv(input_file,output_file,key_columns,chunksize50000):seenset()first_chunkTrueforchunkinpd.read_csv(input_file,chunksizechunksize):# 生成唯一标识基于去重列chunk[_hash]chunk[key_columns].astype(str).agg(|.join,axis1)chunk[_hash]chunk[_hash].apply(lambdax:hashlib.md5(x.encode()).hexdigest())# 过滤掉已见过的mask~chunk[_hash].isin(seen)new_rowschunk[mask]# 更新已见集合seen.update(chunk[_hash].values)# 写入去掉辅助列new_rowsnew_rows.drop(columns[_hash])iffirst_chunk:new_rows.to_csv(output_file,indexFalse,modew)first_chunkFalseelse:new_rows.to_csv(output_file,indexFalse,modea,headerFalse)print(f本块{len(chunk)}行去重后{len(new_rows)}行)deduplicate_large_csv(input.csv,deduped.csv,[订单号,商品ID])这里用了hash而不是直接存整行数据到set里内存占用小很多。CSV和Excel的选型对照特性CSVExcel (xlsx)文件大小上限无限制实际50MB以内流畅行数上限无限制约104万行多Sheet不支持支持格式颜色/合并不支持支持打开速度大文件快慢适合用于数据存储、中转、API输出最终报表、人工查看编码问题可能有乱码无选型口诀数据中转用CSV最终交付用Excel超过50MB用CSVpandas处理。在影刀中集成影刀流程调用Python处理大CSV1. HTTP请求获取数据 → 写入CSV 2. Python代码块分块读取CSV → 清洗 → 输出 3. 可选Python代码块CSV分sheet转Excel 4. 发送Excel或CSV给业务方第2步和第3步在同一个Python代码块里完成减少中间文件。temu店群自动化报活动案例避坑指南坑1编码乱码CSV用UTF-8保存但在Excel中打开中文乱码。解决用UTF-8 BOM格式保存df.to_csv(output.csv,indexFalse,encodingutf-8-sig)utf-8-sig会在文件头加BOM标记Excel能正确识别。坑2CSV的逗号冲突数据里如果包含逗号pandas会自动加引号没问题。但如果你的字段值里包含双引号需要用两个双引号转义。pandas自动处理了这些但如果你手动拼接CSV字符串就要注意。坑3pandas自动推断类型错误比如ID列00123被pandas读成数字123dfpd.read_csv(data.csv,dtype{ID:str})总结处理大CSV的核心思路不要一次性全加载。分块读、筛选列、优化类型——三个技巧解决90%的大文件问题。10万行以下用Excel直接看没问题50万行以上必须切到pandas分块模式。CSV作为数据管道中的中转格式轻量且无上限值得你熟练掌握。内容标签#影刀RPA #CSV #pandas #大数据 #数据处理作者林焱系列影刀RPA进阶教程系列——从数据处理到工程化实践