求助:移除CSV表头、转置数据并合并900个文件,含十六进制转十进制
解决CSV批量处理与格式转换问题
我来帮你完善代码,解决你遇到的重复写入表头、数据转置拼接、十六进制转十进制这些问题,先梳理下你的核心需求:
- 批量读取同一文件夹下的900个CSV文件
- 从文件名提取4个字段作为新CSV的前4列
- 将每个原CSV的
col1/col2数据转置为逗号分隔的字符串(同时把十六进制转十进制) - 合并所有数据到一个新CSV,表头仅写入一次
你的原代码存在几个关键问题:缺少必要模块导入、遍历逻辑冗余、重复写入表头、数据拼接方式错误,以及缺少十六进制转换逻辑,下面是修正并优化后的完整代码:
import os import pandas as pd import csv # 定义输入文件夹和输出文件路径 input_folder = 'c:\\path' output_csv = 'c:\\path\\merged_result.csv' # 初始化结果列表,先加入表头 final_data = [['col1', 'col2', 'col3', 'col4', 'col5', 'col6']] # 仅遍历当前文件夹下的CSV文件(不处理子文件夹) for filename in os.listdir(input_folder): if filename.endswith('.csv'): # 按下划线分割文件名,提取4个目标字段(比按索引截取更灵活) name_parts = filename.split('_') col1_val = name_parts[0] col2_val = name_parts[1] col3_val = name_parts[2] # 去掉最后一部分的.csv后缀 col4_val = name_parts[3].replace('.csv', '') # 读取原CSV文件(注意:你的示例文件是空格分隔,若实际是逗号则改delimiter=',') file_path = os.path.join(input_folder, filename) df = pd.read_csv(file_path, delimiter=' ', encoding='latin-1') # 把col1/col2的十六进制值转成十进制,再拼接成逗号分隔的字符串 # 如果原数据已经是十进制,去掉int(val,16)直接用str(val)即可 col5_val = ','.join(str(int(val, 16)) for val in df['col1']) col6_val = ','.join(str(int(val, 16)) for val in df['col2']) # 将当前文件的所有字段加入结果列表 final_data.append([col1_val, col2_val, col3_val, col4_val, col5_val, col6_val]) # 一次性写入所有数据到输出文件,避免重复打开文件 with open(output_csv, 'w', newline='', encoding='latin-1') as f: writer = csv.writer(f) writer.writerows(final_data) print(f"处理完成!结果已保存至 {output_csv}")
关键细节说明:
- 文件遍历优化:用
os.listdir代替os.walk,只处理当前文件夹的文件,避免子文件夹干扰 - 文件名解析:用
split('_')分割文件名,比固定索引截取更容错,不怕文件名长度变化 - 十六进制转换:通过
int(val, 16)将十六进制字符串转成十进制整数,再拼接成目标格式 - 批量写入:先把所有数据存入列表,最后一次性写入,既提升效率,也不会重复写入表头
- 分隔符适配:你的示例文件是空格分隔,若实际CSV用逗号分隔,把
delimiter=' '改成delimiter=','即可
内容的提问来源于stack exchange,提问作者T.Mou
相关产品推荐
相关产品推荐

