Python提取CSV指定列写入新文件时输出为None,求解决方案
解决CSV提取指定列并写入新文件的问题
我来帮你分析下代码里的问题,然后给出正确的实现方式:
你的代码为什么会输出None?
print()的返回值是None:你写了data=print(row[col]),但print()函数的作用是把内容输出到控制台,它本身的返回值永远是None,所以data变量一直是None,写入文件的自然就是这个值。- 文件打开模式错误:每次循环都用
open("test2.txt", "w")打开文件,w模式会清空文件原有内容再写入,所以即使你之前有正确的数据,也会被覆盖,最后只留下最后一次写入的None。 - 逻辑顺序错误:你逐个列处理数据,而不是按行提取需要的两列再写入,这样会把同一行的
date和data1拆分成单独的行,不符合CSV的格式要求。
正确的实现代码
这里有两种简洁可靠的方式,你可以根据需求选择:
方式一:使用csv.DictReader和csv.DictWriter(可读性更高)
这种方式适合需要按列名提取数据的场景,代码更直观:
import csv import os os.chdir(mydir) # 确保mydir是你已经定义好的目标目录 column_names = ["date", "data1"] # 同时打开输入和输出文件,newline=''避免写入时产生空行 with open("my.csv", "r") as infile, open("test2.csv", "w", newline='') as outfile: # 用DictReader读取原文件,自动将表头作为键 reader = csv.DictReader(infile) # 初始化DictWriter,指定要写入的列名 writer = csv.DictWriter(outfile, fieldnames=column_names) # 先写入新文件的表头 writer.writeheader() # 遍历每一行,提取指定列的数据并写入 for row in reader: # 构造只包含目标列的字典 selected_data = {col: row[col] for col in column_names} writer.writerow(selected_data)
方式二:使用普通csv.reader和csv.writer(性能略优)
如果你的CSV文件很大,这种通过索引提取列的方式效率会更高:
import csv import os os.chdir(mydir) column_names = ["date", "data1"] with open("my.csv", "r") as infile, open("test2.csv", "w", newline='') as outfile: reader = csv.reader(infile) writer = csv.writer(outfile) # 获取第一行表头,找到目标列的索引 header = next(reader) col_indices = [header.index(col) for col in column_names] # 写入新文件的表头 writer.writerow(column_names) # 遍历每一行,提取对应索引的列并写入 for row in reader: selected_row = [row[index] for index in col_indices] writer.writerow(selected_row)
几个关键注意点
- 尽量用
with语句管理文件,它会自动帮你关闭文件,避免资源泄漏。 - 写入CSV时加上
newline='',这是Python官方推荐的写法,可以避免在不同操作系统下产生多余的空行。 - 不要手动拼接CSV内容(比如用逗号分隔),用csv模块的Writer类可以自动处理包含逗号、引号的特殊数据,保证格式正确。
内容的提问来源于stack exchange,提问作者steve
相关产品推荐
相关产品推荐

