如何在Python Jupyter中将CSV文件单列按分号拆分为多列并保存?
实现方案
你原有代码存在3个小问题:打开新文件时''w'多写了一个单引号属于语法错误、csv_writer缩进错误导致后续无法调用、没有补充拆分列的逻辑,下面提供两种可直接运行的实现方式:
方案1:基于你正在使用的csv标准库实现
import csv # 请修改为你CSV中programme列的实际索引,第一列索引为0,第二列为1,依次类推 PROGRAMME_COL_INDEX = 2 with open('IMI.csv', 'r', encoding='utf-8') as csv_file: csv_reader = csv.reader(csv_file) # 读取表头 header = next(csv_reader) # 表头新增拆分后的两列 header.insert(PROGRAMME_COL_INDEX + 1, 'program 1') header.insert(PROGRAMME_COL_INDEX + 2, 'program 2') # 若不需要保留原programme列,可取消注释下一行 # del header[PROGRAMME_COL_INDEX] with open('new_IMI.csv', 'w', encoding='utf-8', newline='') as new_file: # 需要制表符分隔的话,可新增参数 delimiter='\t' csv_writer = csv.writer(new_file) csv_writer.writerow(header) for line in csv_reader: programme_val = line[PROGRAMME_COL_INDEX] # 按分号最多拆分1次,避免后续还有分号导致拆分出多列 programme_split = programme_val.split(';', maxsplit=1) # 处理没有分号的行,补空值 if len(programme_split) == 1: programme_split.append('') # 把拆分结果插入行中 line.insert(PROGRAMME_COL_INDEX + 1, programme_split[0].strip()) line.insert(PROGRAMME_COL_INDEX + 2, programme_split[1].strip()) # 若不需要保留原programme列,可取消注释下一行 # del line[PROGRAMME_COL_INDEX] csv_writer.writerow(line)
方案2:基于pandas的简化实现(更适合新手处理表格)
如果还没安装pandas,先执行pip install pandas安装即可:
import pandas as pd # 读取原CSV df = pd.read_csv('IMI.csv') # 拆分programme列为两列 df[['program 1', 'program 2']] = df['programme'].str.split(';', n=1, expand=True) # 去除拆分结果前后的多余空格 df['program 1'] = df['program 1'].str.strip() df['program 2'] = df['program 2'].str.strip() # 若不需要保留原programme列,可取消注释下一行 # df = df.drop('programme', axis=1) # 写入新CSV,index=False表示不输出pandas自带的行号 df.to_csv('new_IMI.csv', index=False, encoding='utf-8')
注意事项
如果运行时出现编码报错,可将代码中的encoding='utf-8'修改为encoding='gbk'适配中文Windows系统的CSV编码。
内容的提问来源于stack exchange,提问作者AhlemMustapha
相关产品推荐
相关产品推荐

