Python中如何将指定有效列和最后一列复制到另一个文件
实现方案
首选方案:纯Python实现(无需调用awk,无临时文件)
你已经在Python中拿到了符合筛选条件的列索引,直接读写CSV完成导出即可,逻辑更可控:
import csv # 第一步:收集所有要保留的有效列索引(默认0起始,和Python读取顺序一致) keep_cols = [] for f in range(X.shape[1]): if importances[indices[f]] > 0.01: keep_cols.append(indices[f]) # 保留原有特征排名打印逻辑 print("%d. feature %d (%f)" % (f + 1, indices[f], importances[indices[f]])) # 第二步:读写文件完成导出,自动追加原文件最后一列 with open('file1.csv', 'r', encoding='utf-8') as in_f, open('file2.csv', 'w', encoding='utf-8', newline='') as out_f: reader = csv.reader(in_f) writer = csv.writer(out_f) for row in reader: # 拼接有效列+最后一列输出 output_row = [row[i] for i in keep_cols] + [row[-1]] writer.writerow(output_row)
如果数据量不大,用pandas实现更简洁:
import pandas as pd # 收集符合条件的列索引 keep_cols = [indices[f] for f in range(X.shape[1]) if importances[indices[f]]>0.01] df = pd.read_csv('file1.csv') # 筛选有效列+最后一列导出 df_output = df[ keep_cols + [df.columns[-1]] ] df_output.to_csv('file2.csv', index=False)
备选方案:单次awk命令实现(无需循环生成临时文件)
不需要迭代生成临时文件,直接拼出要提取的列,一次awk执行即可完成需求:
import os # 收集awk格式的有效列索引(awk列号从1起始,所以要+1) awk_keep_cols = [str(indices[f]+1) for f in range(X.shape[1]) if importances[indices[f]]>0.01] # 加上awk内置最后一列变量$NF,拼接打印逻辑 print_cols = ','.join([f'${col}' for col in awk_keep_cols] + ['$NF']) awk_cmd = f"awk -F ',' -v OFS=',' '{{print {print_cols}}}' file1.csv > file2.csv" os.system(awk_cmd)
原有尝试代码的问题
- 定义的cmd1、cmd2字符串中的
indices[f]、i是Python变量,未做插值处理,传递给awk后无法识别 - 循环生成多个临时文件的逻辑冗余,执行效率极低,还容易出现文件读写冲突
内容的提问来源于stack exchange,提问作者J.T.
相关产品推荐
相关产品推荐

