如何在Python中按固定元素数(12个)为CSV文件添加换行以分隔列
解决CSV按指定列数(12列)强制换行的Python方案
我来帮你搞定这个CSV格式化的问题——核心思路就是把一整串的CSV元素按每12个一组拆分,然后生成规范的每行12列的CSV文件。关键是要正确处理带逗号的字段(比如"Etsy.com - TheCraftyCa Brooklyn,NY"),直接用字符串拆分容易出错,所以我们用Python内置的csv模块来处理最稳妥。
完整代码实现
从文件读取并处理
如果你的异常CSV已经保存为文件(比如input.csv),用这段代码:
import csv # 读取原始异常CSV文件,自动处理带引号的字段 with open('input.csv', 'r', newline='', encoding='utf-8') as infile: reader = csv.reader(infile) # 读取唯一的一行,得到所有元素的完整列表 all_elements = next(reader) # 按每12个元素为一组拆分列表 chunked_records = [all_elements[i:i+12] for i in range(0, len(all_elements), 12)] # 写入规范的CSV文件 with open('output.csv', 'w', newline='', encoding='utf-8') as outfile: writer = csv.writer(outfile) # 一次性写入所有拆分后的记录 writer.writerows(chunked_records)
直接处理字符串数据
如果你的原始数据是字符串形式(比如你提供的那串内容),可以用StringIO模拟文件处理:
import csv from io import StringIO # 替换成你的原始CSV字符串 raw_csv_data = '''"D276",31386,10610,12122021 00:00:47840 85,0.00+842646,M000395708109323,ACTIVE CARD CHECK,844-6593879,NY,59655,840 6511011091718056,D276,31386,10610,12122021 00:00:59840Y00,5.36-842647,M527021000201360,"Etsy.com - TheCraftyCa Brooklyn,NY",56995,840 6511011091718056,D276,86495,29807,12122021 00:08:22840N51,11.99-842648,M248747000103177,GOOGLE *YouTubePremium g.co/helppay# CA,78295,840 6511016547548056,D276,29969,10038,12122021 00:27:19840 57,11.30-842649,M000445474354997,SPOTIFY,NEW YORK,NY,48995,840 6511010952148056,D276,62521,21152,12122021 00:28:54840N51,5.40-842650,M527021000211443,Google Play,Mountain View CA,58175,840 6511014173278056,D276,802,701,12122021 00:30:38840Y00,49.67-842651,M235251000762203,AMZN Mktp US,Amzn.com/bill WA,59425,840 6511010003058056,D276,114710,41280,12122021 00:31:22840Z00,21.92-842652,M000445488848992,DD *DOORDASH MCDONALDS SAN FRANCISCO CA,58125,840 6511019296778056,D276,125175,45529,12122021 00:31:50840Y05,0.00+842653,M145376000144509,PLAYSTATION NETWORK,800-345-7669 CA,58165,840 6511020299078056,D276,125175,45529,12122021 00:32:07840Y57,21.44-842654,M145376000144509,PLAYSTATION NETWORK,800-345-7669 CA,58165,840 6511020299078056,D276,125175,45529,12122021 00:32:08840Y57,21.44-842299,M527021000222747,PlaystationNetwork,San Mateo,CA,58185,840 6511020299078056,D276,125175,45529,12122021 00:32:09840Y57,21.44-842300,M527021000222747,PlaystationNetwork,San Mateo,CA,58185,840 6511020299078056,D276,125175,45529,12122021 00:32:09840 57,0.00+842655,MCARD ACCPT IDC,Sony - Playstation N.. St. Louis,USA,59695,840 6511020299078056,D276,125175,45529,12122021 00:32:27840Y57,21.44-842301,M145376000144509,PLAYSTATION NETWORK,800-345-7669 CA,58165,840 6511020299078056,D276,125175,45529,12122021 00:32:28840Y57,21.44-842657,M527021000222747,PlaystationNetwork,San Mateo,CA,58185,840 6511020299078056,D276,125175,45529,12122021 00:32:28840Y57,21.44-842656,M527021000222747,PlaystationNetwork,San Mateo,CA,58185,840 6511020299078056,D276,125175,45529,12122021 00:32:29840 57,0.00+842658,MCARD ACCPT IDC,Sony - Playstation N.. St. Louis,USA,59695,840 6511020299078056,D276,112802,40216,12122021 00:32:30840Y00,6.49-842659,M784959000762203,Amazon.com,Amzn.com/bill WA,59425,840 6511019112388056,D276,120407,44199,12122021 00:35:24840 05,3.12-67433,P536385810103481,MILLS FOOD CENTER,OAKLAND,CA,54115,840 6511019841028056,D276,120407,44199,12122021 00:35:48840 05,2.29-67434,P536385810103481,MILLS FOOD CENTER,OAKLAND,CA,54115,840 6511019841028056,D276,129143,47047,12122021''' # 模拟文件读取 with StringIO(raw_csv_data) as infile: reader = csv.reader(infile) all_elements = next(reader) # 拆分记录 chunked_records = [all_elements[i:i+12] for i in range(0, len(all_elements), 12)] # 可以选择打印结果或者写入文件 for idx, record in enumerate(chunked_records, 1): print(f"第{idx}条记录: {','.join(record)}") # 写入规范CSV with open('output.csv', 'w', newline='', encoding='utf-8') as outfile: writer = csv.writer(outfile) writer.writerows(chunked_records)
代码说明
- 用
csv.reader解析数据:这是最关键的一步,它能自动识别带引号的字段,哪怕字段里包含逗号(比如"Etsy.com - TheCraftyCa Brooklyn,NY"),不会像直接用split(',')那样把字段拆碎,保证元素数量准确。 - 按步长拆分列表:用列表推导式
[all_elements[i:i+12] for i in range(0, len(all_elements), 12)]实现每12个元素一组的拆分,自动处理最后一组不足12个元素的情况。 - 写入规范CSV:
csv.writer会自动处理需要加引号的字段,生成符合CSV标准的输出文件。
内容的提问来源于stack exchange,提问作者quiell
相关产品推荐
相关产品推荐

