基于pandas自動化的csv信息提取保存的腳本
在數據處理中遇到大量CSV文件需要提取關鍵信息保存為新CSV文件,為減輕人力工作,查詢大量博客并結合AI編寫自動化腳本實現該功能。
測試學習pandas模塊能力
import pandas as pd from pathlib import Path import chardet import os input_file = '123/LURM.csv' #待處理文件 #檢測文件編碼 with open(input_file, 'rb') as f: raw_data = f.read(10000) # 只讀取前10000字節進行檢測 result = chardet.detect(raw_data) encoding = result['encoding'] print(encoding) #導入文件 df = pd.read_csv(input_file, encoding=encoding) #print(df) print(f"原始數據列名: {list(df.columns)}") #提取指定列 columns_to_extract = ['vn', '報文類型', '采集時間', '上報時間', '車輛狀態', '采集時間', '定位有效性', '緯度類型', '經度類型', '經度', '緯度'] extracted_df = df[columns_to_extract] print(extracted_df) #保存文件 output_file = 'extracted_result.csv' #extracted_df.to_csv(output_file, index=False, encoding='utf-8-sig') extracted_df.to_csv(output_file, index=False, encoding=encoding)
上面這段代碼實現單文件信息提取并保存。要實現CSV文件處理需要使用到pandas模塊,該模塊是大數據文件處理較為熱門模塊。有編程基礎的可以看注釋,基本可以理解,如果沒有建議使用AI工具指導。
正式處理程序
""" CSV文件提取保存程序 代碼第一版時間20250911 """ import pandas as pd from pathlib import Path import chardet import os def detect_encoding(file_path): """檢測文件編碼""" try: with open(file_path, 'rb') as f: raw_data = f.read(10000) # 只讀取前10000字節進行檢測 result = chardet.detect(raw_data) return result['encoding'] except Exception as e: print(f"編碼檢測失敗: {e}") return None def read_csv_with_auto_encoding(file_path): """自動檢測編碼并讀取CSV文件""" # 常見的編碼嘗試順序 encodings_to_try = ['utf-8', 'gbk', 'gb2312', 'gb18030', 'latin1', 'cp1252'] # 首先嘗試自動檢測編碼 detected_encoding = detect_encoding(file_path) if detected_encoding: encodings_to_try.insert(0, detected_encoding) for encoding in encodings_to_try: try: df = pd.read_csv(file_path, encoding=encoding) print(f"? 成功使用 {encoding} 編碼讀取文件") return df, encoding except UnicodeDecodeError: continue except Exception as e: # 如果不是編碼問題,可能是其他錯誤 if 'codec' not in str(e).lower(): raise e # 如果所有編碼都失敗,嘗試使用錯誤處理 try: df = pd.read_csv(file_path, encoding='utf-8', errors='ignore') print("? 使用utf-8編碼并忽略錯誤字符讀取文件") return df, 'utf-8-with-errors-ignored' except Exception as e: raise Exception(f"所有編碼嘗試都失敗: {e}") def save_dataframe_to_csv(extracted_df, file_name, encoding_used, output_folder="output"): """ 保存提取后的DataFrame到CSV文件 參數: extracted_df (pd.DataFrame): 要保存的數據框 file_name (str): 原始文件名(不含擴展名) encoding_used (str): 使用的編碼格式 output_folder (str): 輸出文件夾名,默認為"output" 返回: bool: 保存成功返回True,失敗返回False """ try: # 創建輸出文件夾(如果不存在) output_path = Path(output_folder) output_path.mkdir(exist_ok=True) # 構建輸出文件名:原文件名 + "o" + .csv output_file = output_path / f"{file_name}_o.csv" # 檢查文件是否已存在 if output_file.exists(): raise FileExistsError(f"文件已存在: {output_file}") # 保存為CSV文件 extracted_df.to_csv(output_file, index=False, encoding=encoding_used) print(f"? 數據已成功保存到: {output_file}") print(f" 使用編碼: {encoding_used}") print(f" 數據形狀: {extracted_df.shape[0]} 行, {extracted_df.shape[1]} 列") return True except FileExistsError as e: print(f"?? 文件已存在錯誤: {e}") return False except Exception as e: print(f"? 保存文件失敗: {e}") return False def read_all_csv_files(folder_path): """ 讀取指定文件夾下的所有CSV文件(支持自動編碼檢測) """ if not os.path.exists(folder_path): print(f"錯誤: 文件夾 '{folder_path}' 不存在") return {} csv_files = list(Path(folder_path).glob("*.csv")) if len(csv_files) == 0: print(f"警告: 在 '{folder_path}' 中沒有找到CSV文件") return {} dataframes = {} print(f"找到 {len(csv_files)} 個CSV文件:") print("-" * 50) for csv_file in csv_files: try: print(f"\n正在處理: {csv_file.name}") df, encoding_used = read_csv_with_auto_encoding(csv_file) print(f"? 成功讀取: {csv_file.name}") print(f" 編碼: {encoding_used}") print(f" 數據形狀: {df.shape[0]} 行, {df.shape[1]} 列") print("-" * 50) print(f"原始數據列名: {list(df.columns)}") columns_to_extract = ['vn', '報文類型', '采集時間', '上報時間', '車輛狀態', '采集時間', '定位有效性', '緯度類型', '經度類型', '經度', '緯度'] extracted_df = df[columns_to_extract] #print(extracted_df) # 使用文件名(不含路徑和擴展名)作為鍵 file_name = csv_file.stem dataframes[file_name] = df #保存提取后信息到文件 save_success = save_dataframe_to_csv(extracted_df, file_name, encoding_used) if save_success: print("? 提取的數據已成功保存") else: print("?? 提取的數據保存失敗") except Exception as e: print(f"? 無法讀取 {csv_file.name}: {str(e)}") return dataframes # 主程序 if __name__ == "__main__": # 設置你的文件夾路徑 folder_path = "C:/Users/Downloads/LURM" # 讀取所有CSV文件 all_data = read_all_csv_files(folder_path) print(f"\n{'='*50}") print(f"總結: 成功讀取了 {len(all_data)} 個CSV文件") # 顯示每個文件的基本信息 # for name, df in all_data.items(): # print(f"\n{name}:") # print(f" 形狀: {df.shape}") # if len(df.columns) > 0: # print(f" 列名: {list(df.columns)[:5]}{'...' if len(df.columns) > 5 else ''}") # if len(df) > 0: # print(f" 數據預覽:") # print(df.head(2))
正式程序的核心代碼和測試程序一樣,只不過添加大量錯誤檢測和現實文件信息提取的代碼(該段代碼已注釋)。
代碼寫的比較爛,勿噴,有問題請回復指出。

浙公網安備 33010602011771號