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
相关产品推荐
相关产品推荐

