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

如何在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)

代码说明

  1. 用csv.reader解析数据:这是最关键的一步,它能自动识别带引号的字段,哪怕字段里包含逗号(比如"Etsy.com - TheCraftyCa Brooklyn,NY"),不会像直接用split(',')那样把字段拆碎,保证元素数量准确。
  2. 按步长拆分列表:用列表推导式[all_elements[i:i+12] for i in range(0, len(all_elements), 12)]实现每12个元素一组的拆分,自动处理最后一组不足12个元素的情况。
  3. 写入规范CSV:csv.writer会自动处理需要加引号的字段,生成符合CSV标准的输出文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 18:12:32