基于Python导入多CSV文本文件构建统一高管薪酬数据库技术问询
解决CSV导入与高管薪酬数据表统一方案
一、先处理带表名标识的CSV文件
从PDF导出的CSV常把表名单独放在一行,得先过滤该行,同时把表名存为额外字段方便溯源:
- 遍历目标文件夹下的所有CSV,逐行读取判断:若某行不含CSV分隔符(逗号)或带“表”字后缀,判定为表名
- 提取表名后跳过该行,将剩余有效数据行读成DataFrame,顺便从文件名提取公司名称作为固定字段
- 代码示例:
import pandas as pd import os from io import StringIO def parse_csv_with_table_info(file_path): table_name = None data_lines = [] with open(file_path, 'r', encoding='utf-8') as f: for line in f: clean_line = line.strip() # 可根据实际CSV格式调整表名判断规则 if ',' not in clean_line or clean_line.endswith('表'): table_name = clean_line continue data_lines.append(line) # 用StringIO把数据行转成可读取的对象 df = pd.read_csv(StringIO(''.join(data_lines))) # 从文件名提取公司名(假设文件名是「XX公司.csv」格式) df['company'] = os.path.basename(file_path).rstrip('.csv') if table_name: df['source_table'] = table_name return df
二、统一表头合并所有数据
收集所有处理后的DataFrame,用pd.concat自动处理表头差异——相同表头自动合并,不同表头直接新增列:
- 先把所有CSV解析成DataFrame存入列表
- 合并时设置
ignore_index=True重置索引,sort=False保留列的原始顺序 - 可选:手动统一同义表头(比如把「姓名」「高管姓名」都改成「executive_name」)
- 代码示例:
# 指定CSV文件夹路径 csv_folder = './your_csv_dir' all_dfs = [] for file in os.listdir(csv_folder): if file.endswith('.csv'): full_path = os.path.join(csv_folder, file) df = parse_csv_with_table_info(full_path) all_dfs.append(df) # 合并所有DataFrame,自动处理表头差异 final_df = pd.concat(all_dfs, ignore_index=True, sort=False) # 手动统一同义表头(根据实际收集到的表头补充) header_unify_map = { '姓名': 'executive_name', '高管姓名': 'executive_name', '年薪': 'annual_salary', '年度总薪酬': 'annual_salary', '绩效奖金': 'bonus', '奖金': 'bonus' } final_df.rename(columns=header_unify_map, inplace=True)
三、写入数据库
以SQLite为例,把合并后的DataFrame存入数据库:
import sqlite3 # 连接数据库(不存在则自动创建) conn = sqlite3.connect('executive_compensation.db') # 将数据写入数据表,若表已存在则替换 final_df.to_sql('executive_salaries', conn, if_exists='replace', index=False) # 关闭连接 conn.close()
注意事项
- 表名识别规则要根据实际CSV格式调整,比如如果表名固定在第一行,直接跳过第一行即可
- 表头映射字典需要根据收集到的所有CSV表头补充,确保所有同义字段统一成标准名称
- 如果CSV有编码错误,尝试把
open时的encoding改成gbk或者utf-8-sig
内容的提问来源于stack exchange,提问作者dsafdsfsdf777sdfh
相关产品推荐
相关产品推荐

