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

Python CSV指定列写入新文件遇NameError问题及实现咨询

问题修复与实现方案

错误原因

  • 两次调用csv.reader读取同一个文件对象,第一次循环读完后文件指针移到末尾,第二次循环读不到任何内容,row1变量从未被赋值,导致写入时触发NameError。
  • 用zip(getters(row))完全多余,itemgetter已经返回目标列组成的元组,zip会把每个元素包装成单元素元组,不符合写入需求。
  • 写入阶段的for row in row逻辑错误,这里的row只是最后一次循环的单行数据,不是可迭代的集合,而且row1本身就未定义。

正确实现代码

如果只需要把COLS指定的列写入新文件的独立列(每列对应新文件的一列),可以用下面的代码:

import csv
from operator import itemgetter

# 原文件中要提取的列号(从1开始计数)
COLS = 15, 21, 27
# 转换为csv读取用的索引(从0开始计数)
column_getter = itemgetter(*(col - 1 for col in COLS))

# 同时打开输入和输出文件,避免文件指针问题
with open('result.csv', newline='') as input_file, open('results1.csv', 'w', newline='') as output_file:
    csv_reader = csv.reader(input_file)
    csv_writer = csv.writer(output_file, delimiter=',')
    
    # 遍历每一行,提取目标列并写入新文件
    for row in csv_reader:
        # 获取指定列的内容,返回元组
        target_cols = column_getter(row)
        # 将元组作为一行写入,每个元素对应新文件的一个独立列
        csv_writer.writerow(target_cols)

补充:保留表头的版本

如果原文件有表头,需要一起写入新文件,可以加几行处理表头:

import csv
from operator import itemgetter

COLS = 15, 21, 27
column_getter = itemgetter(*(col - 1 for col in COLS))

with open('result.csv', newline='') as input_file, open('results1.csv', 'w', newline='') as output_file:
    csv_reader = csv.reader(input_file)
    csv_writer = csv.writer(output_file, delimiter=',')
    
    # 先读取并写入表头
    header_row = next(csv_reader)
    csv_writer.writerow(column_getter(header_row))
    
    # 再处理所有数据行
    for row in csv_reader:
        csv_writer.writerow(column_getter(row))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 21:50:38