影刀RPA CSV文件高级处理大文件与编码署名林焱什么情况用什么RPA处理数据时CSV是比Excel更轻量的选择——不需要安装Excel读写速度快适合大数据量。但CSV也有编码问题和格式陷阱。场景推荐方式特点普通CSV读写csv模块 / pandas简单直接大文件处理csv逐行读 / pandas chunk内存友好编码问题指定encoding参数解决乱码怎么做一基础读写importcsv# 写入CSVdata[[姓名,年龄,部门],[张三,28,研发部],[李四,35,市场部],[王五,24,财务部],]withopen(rD:\数据\员工.csv,w,encodingutf-8-sig,newline)asf:writercsv.writer(f)writer.writerows(data)# 读取CSVwithopen(rD:\数据\员工.csv,r,encodingutf-8-sig)asf:readercsv.reader(f)headersnext(reader)# 第一行是表头forrowinreader:print(f{row[0]}|{row[1]}|{row[2]})二用DictReader/DictWriter拼多多店群自动化报活动上架importcsv# 写入字典模式employees[{姓名:张三,年龄:28,部门:研发部},{姓名:李四,年龄:35,部门:市场部},]withopen(rD:\数据\员工.csv,w,encodingutf-8-sig,newline)asf:fieldnames[姓名,年龄,部门]writercsv.DictWriter(f,fieldnamesfieldnames)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6b4600fc7c494ddc9d263f99b090559c.png#pic_center)writer.writeheader()writer.writerows(employees)# 读取字典模式withopen(rD:\数据\员工.csv,r,encodingutf-8-sig)asf:readercsv.DictReader(f)forrowinreader:print(f{row[姓名]}-{row[部门]})三pandas处理CSVimportpandasaspd# 读取dfpd.read_csv(rD:\数据\员工.csv,encodingutf-8-sig)print(df.head())print(f共{len(df)}行)# 筛选devdf[df[部门]研发部]print(dev)# 保存dev.to_csv(rD:\数据\研发部员工.csv,indexFalse,encodingutf-8-sig)四大文件逐行处理importcsv# 处理大文件逐行读取不全部加载到内存input_pathrD:\数据\大数据.csvoutput_pathrD:\数据\处理后.csvwithopen(input_path,r,encodingutf-8-sig)asfin,\open(output_path,w,encodingutf-8-sig,newline)asfout:readercsv.DictReader(fin)writercsv.DictWriter(fout,fieldnamesreader.fieldnames[处理状态])writer.writeheader()count0forrowinreader:# 逐行处理row[处理状态]已处理ifrow.get(金额)else跳过writer.writerow(row)count1ifcount%100000:print(f已处理{count}行)print(f完成共处理{count}行)五pandas分块读取importpandasaspd# 分块读取大CSVchunk_size10000csv_pathrD:\数据\百万数据.csv# 方式1逐块处理results[]forchunkinpd.read_csv(csv_path,chunksizechunk_size,encodingutf-8-sig):# 在每块上做聚合计算summarychunk.groupby(部门)[金额].sum()results.append(summary)print(f处理了{len(chunk)}行)# 合并所有块的结果finalpd.concat(results).groupby(level0).sum()print(final)完整流程CSV数据清洗管道importcsvimportosfromdatetimeimportdatetime# yd_input: input_path, output_pathinput_pathyd_input.get(input_path,rD:\数据\原始数据.csv)output_pathyd_input.get(output_path,rD:\数据\清洗结果.csv)# 自动检测编码defdetect_encoding(file_path):尝试不同编码打开文件encodings[utf-8-sig,utf-8,gbk,gb2312,gb18030,latin-1]forencinencodings:try:withopen(file_path,r,encodingenc)asf:f.read(1024)# 尝试读一小段returnencexcept(UnicodeDecodeError,UnicodeError):continuereturnutf-8-sig# 默认encodingdetect_encoding(input_path)print(f检测到编码:{encoding})# 处理数据stats{total:0,valid:0,invalid:0,duplicates:0}seen_keysset()withopen(input_path,r,encodingencoding)asfin,\open(output_path,w,encodingutf-8-sig,newline)asfout:readercsv.DictReader(fin)# 输出字段output_fieldslist(reader.fieldnames)[清洗状态,清洗时间]writercsv.DictWriter(fout,fieldnamesoutput_fields)writer.writeheader()forrowinreader:stats[total]1# 清洗1去空行ifnotany(str(v).strip()forvinrow.values()):stats[invalid]1continue# 清洗2去重以某列为keykeyf{row.get(订单号,)}_{row.get(日期,)}ifkeyinseen_keys:stats[duplicates]1continueseen_keys.add(key)# 清洗3字段格式化fork,vinrow.items():ifv:row[k]str(v).strip()# 去除金额中的逗号和if金额inkor价格ink:row[k]str(v).replace(,).replace(,,).strip()# 标记状态row[清洗状态]有效row[清洗时间]datetime.now().strftime(%Y-%m-%d %H:%M:%S)writer.writerow(row)stats[valid]1print(f总计:{stats[total]}, 有效:{stats[valid]}, 无效:{stats[invalid]}, 重复:{stats[duplicates]})yd_output{status:ok,stats:stats,encoding:encoding}有什么坑坑一CSV打开中文乱码现象用Python写入的UTF-8编码CSV用Excel打开后中文乱码。原因Excel默认用ANSI编码中文系统下是GBK打开CSVUTF-8编码的文件没有BOM头时Excel无法正确识别。解决写入时用utf-8-sig编码带BOM头# 正确用utf-8-sig带BOMwithopen(data.csv,w,encodingutf-8-sig,newline)asf:writercsv.writer(f)writer.writerows(data)# 读取时也用utf-8-sig自动处理BOMwithopen(data.csv,r,encodingutf-8-sig)asf:readercsv.reader(f)# 错误用utf-8无BOMExcel打开乱码# with open(data.csv, w, encodingutf-8, newline) as f: ❌坑二字段中包含逗号导致列错位现象某字段值是北京,上海CSV打开后北京和上海被分成两列。TEMU店群矩阵自动化运营核价报活动原因CSV用逗号分隔字段字段值中的逗号需要用引号包裹。解决csv模块自动处理引号但手动拼接字符串时需要注意importcsv# csv.writer自动处理包含逗号的字段会自动加引号data[张三,28,北京,上海]withopen(data.csv,w,encodingutf-8-sig,newline)asf:writercsv.writer(f)writer.writerow(data)# 实际写入: 张三,28,北京,上海 ← 自动加了引号# 错误手动拼接# line ,.join(data) ❌ 张三,28,北京,上海 → 4列# f.write(line \n)坑三字段中包含换行符现象CSV某个字段包含换行符读取后行数变多了。原因CSV中带引号的字段可以包含换行符但某些简易解析器不支持。解决用csv模块支持引号内换行或预处理去掉换行importcsv# csv模块正确处理引号内换行withopen(data.csv,r,encodingutf-8-sig)asf:readercsv.reader(f)forrowinreader:print(row)# 即使字段中有换行也能正确读取为一行# 预处理去掉字段中的换行符forrowindata:foriinrange(len(row)):row[i]str(row[i]).replace(\n, ).replace(\r,)坑四CSV文件末尾空行过多现象用csv.writer写入后文件每行后面多了一个空行。原因Windows下open默认的换行符处理导致\r\n被写成\r\r\n。解决写入时加newline参数# 正确加newlinewithopen(data.csv,w,encodingutf-8-sig,newline)asf:writercsv.writer(f)writer.writerows(data)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f05b6e2cce6a4122a171d4373bbceb61.png#pic_center)# 错误不加newline# with open(data.csv, w, encodingutf-8-sig) as f: ❌ 会有多余空行# writer csv.writer(f)