找回密码
 立即注册
首页 业界区 安全 基于pandas自动化的csv信息提取保存的脚本 ...

基于pandas自动化的csv信息提取保存的脚本

姘轻拎 2025-9-15 18:40:17
在数据处理中遇到大量CSV文件需要提取关键信息保存为新CSV文件,为减轻人力工作,查询大量博客并结合AI编写自动化脚本实现该功能。
测试学习pandas模块能力

 
  1. import pandas as pd
  2. from pathlib import Path
  3. import chardet
  4. import os
  5. input_file = '123/LURM.csv' #待处理文件
  6. #检测文件编码
  7. with open(input_file, 'rb') as f:
  8.     raw_data = f.read(10000)  # 只读取前10000字节进行检测
  9.     result = chardet.detect(raw_data)
  10.     encoding = result['encoding']
  11.     print(encoding)
  12. #导入文件
  13. df = pd.read_csv(input_file, encoding=encoding)
  14. #print(df)
  15. print(f"原始数据列名: {list(df.columns)}")
  16. #提取指定列
  17. columns_to_extract = ['vn', '报文类型', '采集时间', '上报时间', '车辆状态', '采集时间', '定位有效性', '纬度类型', '经度类型', '经度', '纬度']
  18. extracted_df = df[columns_to_extract]
  19. print(extracted_df)
  20. #保存文件
  21. output_file = 'extracted_result.csv'
  22. #extracted_df.to_csv(output_file, index=False, encoding='utf-8-sig')
  23. extracted_df.to_csv(output_file, index=False, encoding=encoding)
复制代码
上面这段代码实现单文件信息提取并保存。要实现CSV文件处理需要使用到pandas模块,该模块是大数据文件处理较为热门模块。有编程基础的可以看注释,基本可以理解,如果没有建议使用AI工具指导。
 
正式处理程序

 
  1. """ CSV文件提取保存程序
  2.     代码第一版时间20250911
  3. """
  4. import pandas as pd
  5. from pathlib import Path
  6. import chardet
  7. import os
  8. def detect_encoding(file_path):
  9.     """检测文件编码"""
  10.     try:
  11.         with open(file_path, 'rb') as f:
  12.             raw_data = f.read(10000)  # 只读取前10000字节进行检测
  13.             result = chardet.detect(raw_data)
  14.             return result['encoding']
  15.     except Exception as e:
  16.         print(f"编码检测失败: {e}")
  17.         return None
  18. def read_csv_with_auto_encoding(file_path):
  19.     """自动检测编码并读取CSV文件"""
  20.     # 常见的编码尝试顺序
  21.     encodings_to_try = ['utf-8', 'gbk', 'gb2312', 'gb18030', 'latin1', 'cp1252']
  22.    
  23.     # 首先尝试自动检测编码
  24.     detected_encoding = detect_encoding(file_path)
  25.     if detected_encoding:
  26.         encodings_to_try.insert(0, detected_encoding)
  27.    
  28.     for encoding in encodings_to_try:
  29.         try:
  30.             df = pd.read_csv(file_path, encoding=encoding)
  31.             print(f"✓ 成功使用 {encoding} 编码读取文件")
  32.             return df, encoding
  33.         except UnicodeDecodeError:
  34.             continue
  35.         except Exception as e:
  36.             # 如果不是编码问题,可能是其他错误
  37.             if 'codec' not in str(e).lower():
  38.                 raise e
  39.    
  40.     # 如果所有编码都失败,尝试使用错误处理
  41.     try:
  42.         df = pd.read_csv(file_path, encoding='utf-8', errors='ignore')
  43.         print("✓ 使用utf-8编码并忽略错误字符读取文件")
  44.         return df, 'utf-8-with-errors-ignored'
  45.     except Exception as e:
  46.         raise Exception(f"所有编码尝试都失败: {e}")
  47. def save_dataframe_to_csv(extracted_df, file_name, encoding_used, output_folder="output"):
  48.     """
  49.     保存提取后的DataFrame到CSV文件
  50.    
  51.     参数:
  52.         extracted_df (pd.DataFrame): 要保存的数据框
  53.         file_name (str): 原始文件名(不含扩展名)
  54.         encoding_used (str): 使用的编码格式
  55.         output_folder (str): 输出文件夹名,默认为"output"
  56.    
  57.     返回:
  58.         bool: 保存成功返回True,失败返回False
  59.     """
  60.     try:
  61.         # 创建输出文件夹(如果不存在)
  62.         output_path = Path(output_folder)
  63.         output_path.mkdir(exist_ok=True)
  64.         
  65.         # 构建输出文件名:原文件名 + "o" + .csv
  66.         output_file = output_path / f"{file_name}_o.csv"
  67.         
  68.         # 检查文件是否已存在
  69.         if output_file.exists():
  70.             raise FileExistsError(f"文件已存在: {output_file}")
  71.         
  72.         # 保存为CSV文件
  73.         extracted_df.to_csv(output_file, index=False, encoding=encoding_used)
  74.         
  75.         print(f"✓ 数据已成功保存到: {output_file}")
  76.         print(f"  使用编码: {encoding_used}")
  77.         print(f"  数据形状: {extracted_df.shape[0]} 行, {extracted_df.shape[1]} 列")
  78.         
  79.         return True
  80.         
  81.     except FileExistsError as e:
  82.         print(f"⚠️  文件已存在错误: {e}")
  83.         return False
  84.     except Exception as e:
  85.         print(f"❌ 保存文件失败: {e}")
  86.         return False
  87.    
  88. def read_all_csv_files(folder_path):
  89.     """
  90.     读取指定文件夹下的所有CSV文件(支持自动编码检测)
  91.     """
  92.     if not os.path.exists(folder_path):
  93.         print(f"错误: 文件夹 '{folder_path}' 不存在")
  94.         return {}
  95.    
  96.     csv_files = list(Path(folder_path).glob("*.csv"))
  97.    
  98.     if len(csv_files) == 0:
  99.         print(f"警告: 在 '{folder_path}' 中没有找到CSV文件")
  100.         return {}
  101.    
  102.     dataframes = {}
  103.    
  104.     print(f"找到 {len(csv_files)} 个CSV文件:")
  105.     print("-" * 50)
  106.    
  107.     for csv_file in csv_files:
  108.         try:
  109.             print(f"\n正在处理: {csv_file.name}")
  110.             df, encoding_used = read_csv_with_auto_encoding(csv_file)
  111.             print(f"✓ 成功读取: {csv_file.name}")
  112.             print(f"  编码: {encoding_used}")
  113.             print(f"  数据形状: {df.shape[0]} 行, {df.shape[1]} 列")
  114.             print("-" * 50)
  115.             print(f"原始数据列名: {list(df.columns)}")
  116.             columns_to_extract = ['vn', '报文类型', '采集时间', '上报时间', '车辆状态', '采集时间', '定位有效性', '纬度类型', '经度类型', '经度', '纬度']
  117.             extracted_df = df[columns_to_extract]
  118.             #print(extracted_df)
  119.             
  120.             # 使用文件名(不含路径和扩展名)作为键
  121.             file_name = csv_file.stem
  122.             dataframes[file_name] = df
  123.             #保存提取后信息到文件
  124.             save_success = save_dataframe_to_csv(extracted_df, file_name, encoding_used)
  125.             if save_success:
  126.                 print("✓ 提取的数据已成功保存")
  127.             else:
  128.                 print("⚠️  提取的数据保存失败")
  129.             
  130.         except Exception as e:
  131.             print(f"✗ 无法读取 {csv_file.name}: {str(e)}")
  132.    
  133.     return dataframes
  134. # 主程序
  135. if __name__ == "__main__":
  136.    
  137.     # 设置你的文件夹路径
  138.     folder_path = "C:/Users/Downloads/LURM"
  139.    
  140.     # 读取所有CSV文件
  141.     all_data = read_all_csv_files(folder_path)
  142.    
  143.     print(f"\n{'='*50}")
  144.     print(f"总结: 成功读取了 {len(all_data)} 个CSV文件")
  145.    
  146.     # 显示每个文件的基本信息
  147.     # for name, df in all_data.items():
  148.     #     print(f"\n{name}:")
  149.     #     print(f"  形状: {df.shape}")
  150.     #     if len(df.columns) > 0:
  151.     #         print(f"  列名: {list(df.columns)[:5]}{'...' if len(df.columns) > 5 else ''}")
  152.     #     if len(df) > 0:
  153.     #         print(f"  数据预览:")
  154.     #         print(df.head(2))
复制代码
正式程序的核心代码和测试程序一样,只不过添加大量错误检测和现实文件信息提取的代码(该段代码已注释)。
代码写的比较烂,勿喷,有问题请回复指出。
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册