Files
2026-07-13 12:35:57 +08:00

122 lines
3.6 KiB
Python

import os
import pandas as pd
from tqdm import tqdm
# 定义输入和输出文件夹
input_folder = "./output/GT_ML_TEST/"
output_folder = "./merged/"
output_filename = "GT_ML_TEST.csv"
# 创建输出文件夹(如果不存在)
os.makedirs(output_folder, exist_ok=True)
def get_unique_column_name(existing_columns, base_name="file_name"):
"""
生成唯一的列名,如果列名已存在则添加序号
参数:
existing_columns: 现有列名列表
base_name: 基础列名
返回:
唯一的列名
"""
if base_name not in existing_columns:
return base_name
counter = 1
while True:
new_name = f"{base_name}{counter}"
if new_name not in existing_columns:
return new_name
counter += 1
def merge_csv_files(input_folder, output_folder, output_filename):
"""
合并文件夹中所有CSV文件
参数:
input_folder: 输入文件夹路径
output_folder: 输出文件夹路径
output_filename: 输出文件名
逻辑:
- 读取所有.csv文件
- 保留所有不同的列名
- 添加file_name列记录来源文件
- 输出单个合并后的CSV文件
"""
# 获取所有CSV文件
csv_files = [f for f in os.listdir(input_folder) if f.endswith('.csv')]
if not csv_files:
print(f"警告: 在文件夹 {input_folder} 中未找到CSV文件")
return
print(f"找到 {len(csv_files)} 个CSV文件")
# 用于存储所有数据框
all_dataframes = []
# 逐个读取CSV文件
for filename in tqdm(csv_files, desc="读取CSV文件"):
try:
file_path = os.path.join(input_folder, filename)
df = pd.read_csv(file_path, encoding='utf-8-sig')
# 记录原始文件名(不含后缀)
source_file_name = os.path.splitext(filename)[0]
# 暂时存储文件名信息
df['__temp_source_file__'] = source_file_name
all_dataframes.append(df)
print(f" 读取文件: {filename} ({len(df)} 行, {len(df.columns)} 列)")
except Exception as e:
print(f" 错误: 读取文件 {filename} 时出错: {e}")
continue
if not all_dataframes:
print("错误: 没有成功读取任何CSV文件")
return
# 合并所有数据框,保留所有列
print("\n开始合并CSV文件...")
merged_df = pd.concat(all_dataframes, ignore_index=True, sort=False)
# 获取所有现有列名(不包括临时列)
existing_columns = [col for col in merged_df.columns if col != '__temp_source_file__']
# 生成唯一的file_name列名
file_name_column = get_unique_column_name(existing_columns)
# 将临时列重命名为最终列名
merged_df.rename(columns={'__temp_source_file__': file_name_column}, inplace=True)
# 将file_name列移到第一列
cols = merged_df.columns.tolist()
cols.remove(file_name_column)
cols = [file_name_column] + cols
merged_df = merged_df[cols]
# 输出合并结果信息
print(f"\n合并完成:")
print(f" 总行数: {len(merged_df)}")
print(f" 总列数: {len(merged_df.columns)}")
print(f" 文件名列: {file_name_column}")
print(f" 所有列名: {list(merged_df.columns)}")
# 保存合并后的文件
output_filepath = os.path.join(output_folder, output_filename)
merged_df.to_csv(output_filepath, index=False, encoding='utf-8-sig')
print(f"\n合并文件已保存: {output_filepath}")
if __name__ == "__main__":
# 执行合并操作
merge_csv_files(input_folder, output_folder, output_filename)