Pyhton-EXCEL與Mysql數據對比

該段代碼主要實現從數據庫和 Excel 文件中讀取數據,并對兩者進行字段匹配,最終找出 Excel 中未匹配到的數據庫記錄。功能如下:

  1. [sqlSelect()]:連接 MySQL 數據庫并查詢比價單及其商品信息。
  2. [BiJiaDaoChu()]:調用外部 API 導出 Excel 文件(注釋中未被調用)。
  3. [read_excel_to_dict()]:將 Excel 文件讀取為字典列表。
  4. [normalize_value()]:統一不同格式的值(如時間、空值、數字轉字符串),便于后續比較。
  5. [match_list_to_list()]:根據字段映射匹配兩個字典列表中的條目,允許時間差 2 秒。
  6. [find_unmatched_in_list_b()]:找出在 Excel 中沒有匹配到的數據庫記錄。

最終輸出:打印出數據庫中在 Excel 中未找到匹配項的數據。

import jsonimport pandas as pd
import pymysql
import requests
import datetime
import numpy as np
from pymysql import Timestampdef sqlSelect():global result_skudb = pymysql.Connect(host='IP',port=3306,user='user',password='password',db='test',charset='utf8',cursorclass=pymysql.cursors.DictCursor)cur = db.cursor()sql = 'select * from aaa a join bbb b  on a.id=b.sheet_id where a.status in(1,2)'cur.execute(sql)result_sku = cur.fetchall()cur.close()db.close()# print(result_sku)return result_skudef BiJiaDaoChu():data = {"askSheetCode": None}headers = {"Authorization": "440d9854d7434d1f998081abc6785fab","Content-Type": "application/json"}url = 'http:test/export'response = requests.post(url=url, data=json.dumps(data), headers=headers)# 判斷響應類型content_type = response.headers.get('Content-Type', '')if 'application/json' in content_type:try:print(response.json())  # 嘗試解析 JSONexcept json.JSONDecodeError:print("無法解析 JSON 響應")elif 'application/octet-stream' in content_type or 'application/vnd.ms-excel' in content_type:with open("../data/exported_data_bijia_test.xls", "wb") as f:f.write(response.content)  # 保存 Excel 文件print("文件已保存為 exported_data_bijia_test.xls")else:print("未知響應類型:", content_type)print(response.text)def read_excel_to_dict(file_path):"""讀取 Excel 文件并將數據以字典的形式返回。:param file_path: Excel 文件的路徑:return: 包含數據的字典列表"""try:# 讀取 Excel 文件df = pd.read_excel(file_path)# 將 DataFrame 轉換為字典列表data = df.to_dict(orient='records')# print("Excel 數據讀取成功", data)return dataexcept Exception as e:print(f"讀取 Excel 文件時出錯: {e}")return []def normalize_value(value):# 處理空值if value is None or (isinstance(value, float) and np.isnan(value)) or value == '':return None# 統一時間格式為 datetime.datetimeif isinstance(value, pd.Timestamp):return value.to_pydatetime()elif isinstance(value, datetime.datetime):return valueelif isinstance(value, datetime.date):return datetime.datetime.combine(value, datetime.time())# 統一數字類型為字符串if isinstance(value, (int, float)):return str(int(value)) if isinstance(value, float) else str(value)# 統一字符串類型:去除前后空格if isinstance(value, str):return value.strip()return valuedef match_list_to_list(list_a, list_b, field_mapping):"""比較兩個字典列表,返回匹配成功的對。增加字段級調試打印 + 時間字段允許最多相差 2 秒。"""matched_pairs = []for a_item in list_a:for b_item in list_b:matched = Truefor key_a, key_b in field_mapping.items():val_a = normalize_value(a_item.get(key_a))val_b = normalize_value(b_item.get(key_b))# 如果都是時間類型,允許最多差 2 秒if isinstance(val_a, datetime.datetime) and isinstance(val_b, datetime.datetime):diff_seconds = abs((val_a - val_b).total_seconds())if diff_seconds <= 2:continue  # 允許匹配成功elif val_a != val_b:#print(f"[字段不匹配] {key_a}({val_a!r}) vs {key_b}({val_b!r})")matched = Falsebreakif matched:matched_pairs.append((a_item, b_item))#print("[匹配成功] 找到一對匹配項")break  # 可選:找到第一個就停止return matched_pairsdef find_unmatched_in_list_b(matched_pairs, list_b):# print("完整匹配對 matched_pairs:", matched_pairs)matched_keys = []for idx, (a_item, b_item) in enumerate(matched_pairs):# print(f"[{idx}] 提取 b.id: {b_item['b.id']}")  # 調試每條提取matched_keys.append(b_item['b.id'])# print("提取到的所有 b.id 列表:", matched_keys)unmatched_b_items = []for item in list_b:if item['b.id'] not in matched_keys:unmatched_b_items.append(item)return unmatched_b_itemsfile_path = "../data/exported_data_bijia_test.xls"
excel_data = read_excel_to_dict(file_path)
list_a = excel_data
list_b = sqlSelect()mapping = {'需求比價單號': 'sheet_sn', '業務分類': 'business_class', '報價開始時間': 'quotation_start_time','報價截止時間': 'quotation_end_time', '采購單位': 'purchase_unit', '聯系人': 'lixiren', '聯系方式': 'mobile','商品名稱': 'goods_name', '品牌': 'pinpai', '計量單位': 'unit', '采購數量': 'number', '規格描述': 'specifications',
'技術標準': 'standard_code', '備注': 'remark', '其他信息': 'other_info'}matches = match_list_to_list(list_a, list_b, mapping)
# print("匹配結果:=========", matches)
# for a, b in matches:
#     print("匹配成功:")
#     print("  list_a 項:", a)
#     print("  list_b 項:", b)
# 查找未匹配的 list_b 數據
unmatched_b = find_unmatched_in_list_b(matches, list_a, list_b)# 打印出來
print("=== list_b 中未在 list_a 匹配到的數據 ===")
for item in unmatched_b:print(item)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87119.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87119.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87119.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

InnoDB索引

1、索引的建立 / 數據的存儲 一條條數據存儲到頁中后&#xff0c;各個數據頁組成了一個雙向鏈表&#xff0c;而每個數據頁中的記錄會按照主鍵值從小到大的順序組成一個單向鏈表。此時&#xff0c;如果我想根據主鍵值查詢一條記錄&#xff0c;只能從第一個數據頁開始一個頁一個頁…

[考研408數據結構]王道大題暑假自用復習記錄(每日更新...)

DAY1 2025年6月29日 雨轉晴&#x1f327;&#x1f324; 第二章 線性表 2.2線性表的順序表示 1、從順序表中刪除具有最小值的元素&#xff08;假設唯一&#xff09;并由函數返回被刪元素的值。空出的位置由最后一個元素填補&#xff0c;若順序表為空&#xff0c;則顯示出錯信…

vue2 el-select下拉選擇框 點擊其他位置或者彈窗關閉下拉框/點擊取消時,下拉框變成之前的值

1.elSelect點擊空白處無法收起下拉框&#xff08;失去焦點并隱藏&#xff09; // 定義指令 directives: {clickOutside: {bind: function (el, binding, vnode) {el.clickOutsideEvent function (event) { // here I check that click was outside the el and his childrensif…

MYSQL-JAVAweb1

1.登錄 在黑框中輸入 net start mysql // 啟動mysql服務 net stop mysql // 停止mysql服務1.MySQL數據模型 關系型數據庫&#xff1a; 關系型數據庫是建立在關系模型基礎上的數據庫&#xff0c;簡單說&#xff0c;關系型數據庫是由多張能互相連接的 二維表 組成的數據庫 如…

將POD指定具體機器上運行

在Kubernetes中&#xff0c;你可以通過多種方式將Pod調度到指定的節點&#xff08;機器&#xff09;上運行。以下是幾種常用的方法及其適用場景&#xff1a; 1. NodeSelector&#xff08;簡單標簽匹配&#xff09; 通過標簽選擇器將Pod綁定到具有特定標簽的節點。 步驟 為目…

eNSP實驗一:IPv4編址及IPv4路由基礎

一、實驗目的&#xff1a; 配置各路由器上的物理接口的IP地址并實現互聯互通配置各路由器的 Loopback 的IP地址并實現互聯互通&#xff08;包括備份路由&#xff0c;默認路由&#xff09;圖中三個路由器型號為 AR3620。 二、配置物理接口ip 基礎配置 設備命名<Huawei>…

基于自然語言處理(NLP)的Twitter情感分析系統

本課題致力于構建一個基于自然語言處理&#xff08;NLP&#xff09;與機器學習技術的Twitter情感分析系統&#xff0c;旨在自動識別用戶推文中的主觀情緒傾向&#xff0c;如正面、負面或中性。研究過程中將對海量Twitter文本數據進行預處理&#xff0c;包括去除噪聲、分詞、詞性…

H.264中片數據分割(Slice Data Partitioning)介紹

H.264中**片數據分割&#xff08;Slice Data Partitioning&#xff09;**的解碼機制。讓我為您詳細解析&#xff1a; 1. 片數據&#xff08;Slice Data Partitioning&#xff09;分割的概念 片數據分割是H.264中的一種錯誤恢復機制&#xff0c;通過將片數據分成不同的部分&am…

muduo

好的&#xff0c;我們來深入剖析陳碩老師開發的著名C網絡庫——muduo。它以“簡單、高效、易用”著稱&#xff0c;是學習Linux C高性能網絡編程的絕佳范本。我會盡量詳細、通俗地講解其核心思想、關鍵組件、源碼結構和工作原理。 核心思想&#xff1a;Reactor 模式 (Non-block…

將目錄下所有圖像中非0像素值改為1或者255

圖像二值化處理技術大綱 目標與背景 解釋圖像二值化的意義,分析將非零像素值統一調整為1或255的應用場景(如簡化數據、增強特征、適配模型輸入等)。 核心方法概述 列舉常見圖像格式(如PNG、JPEG)的像素值范圍,說明非零像素的定義(RGB或灰度圖像中的非黑像素)。 方…

Reactor ConnectableFlux支持多訂閱者

在 Reactor 中&#xff0c;ConnectableFlux 是一種用于處理響應式流的機制&#xff0c;它允許你控制何時開始訂閱和數據生成。通常情況下&#xff0c;訂閱者&#xff08;subscriber&#xff09;在訂閱時會立即開始接收數據&#xff0c;但有時你可能希望多個訂閱者“會面”&…

vite + vue 項目下使用 tailwindcss

版本 node: > 18.0.0 vue: 3.5.13 vite: 6.3.1 tailwindcss: 4.1.6 tailwindcss/vite: 4.1.6 tailwindcss ? 細粒度類庫 提供數千個原子級CSS類&#xff08;如 text-center、bg-blue-500、p-4&#xff09;&#x1f9e9; 組合式開發 通過類名組合構建完全自定義的UI&#x…

Hibernate中save與saveOrUpdate的差異解析

在Hibernate中&#xff0c;save()和saveOrUpdate()都是用于持久化對象的方法&#xff0c;但它們的適用場景和行為有顯著差異&#xff1a; 1. save()方法 核心行為&#xff1a; 僅適用于瞬時態&#xff08;Transient&#xff09;對象&#xff08;即新創建、未與Session關聯的對象…

香橙派3B學習筆記14:deb 打包程序_解包前后腳本運行

本文學習如何用deb打包的方式打包自己需要調用系統庫的程序。 然后實現deb解包前后的腳本運行。 目錄 承接上文&#xff1a; 刪除上文遺留的.so文件&#xff1a; 終止ledlight進程&#xff1a; 目標解釋&#xff1a; 創建項目結構&#xff1a; 創建control文件&#xff1a; 創…

nanoGPT復現——prepare拆解(自己構建詞表 VS tiktoken)

在nanoGPT的data文件夾有兩個很相似的文件夾結構&#xff1a;shakespeare和shakespeare-char&#xff0c;這兩種都是對shakespeare數據集的處理&#xff0c;但是shakespeare使用的是tiktoken對文字進行編碼&#xff0c;另一個則是使用自己構建的詞表 一、shakespeare-char&…

macos 安裝 xcode

在 macOS 上安裝 Xcode&#xff08;或者 Xcode Command Line Tools&#xff09;的方法如下&#xff1a; 1. 安裝 Xcode Command Line Tools&#xff08;輕量級&#xff0c;滿足大部分編譯需求&#xff09; 終端命令&#xff1a; xcode-select --install會彈出安裝提示&#x…

大學專業科普 | 云計算、大數據

大數據專業是近年來隨著信息技術發展而興起的熱門學科&#xff0c;專注于從海量、多樣化的數據中提取有價值信息&#xff0c;為各行業提供數據驅動的決策支持。 專業定義 大數據專業旨在培養掌握大數據采集、存儲、管理、分析和應用等核心技術的人才。該專業融合了計算機科學…

本地文件自動提交到倉庫

背景 將本地目錄做一個存儲倉庫&#xff0c;將歸檔的文件放入其中。自動同步到遠程倉庫。 倉庫配置 省略 配置密鑰 用戶可以 git pull \ git push \ git commit 自動 拉取、更新 腳本 文件名&#xff1a;autosave.sh #!/bin/zsh# 設置變量 LOCAL_DIR$1# 進入工作目錄 cd "…

Ubuntu中控制用戶存儲空間配置步驟

目的&#xff0c;限制用戶磁盤空間占用&#xff0c;例如給用戶限制100-150G容量 1.安裝磁盤配額工具 sudo apt-get install -y quota 2.備份并修改/etc/fstab文件&#xff0c;使能支持quota sudo cp /etc/fstab /etc/fstab.bak vim /etc/fstab #寫入如下,usrjquotaaquota.u…

【網絡】Linux 內核優化實戰 - net.ipv4.tcp_rmem 和 net.core.rmem_default 關系

net.ipv4.tcp_rmem 和 net.core.rmem_default 都是 Linux 內核中控制網絡接收緩沖區的參數,但它們的作用范圍、優先級和使用場景存在明顯區別。以下是詳細對比: 核心區別 參數net.ipv4.tcp_rmemnet.core.rmem_default作用協議僅針對 TCP 協議針對 所有網絡協議(TCP、UDP 等…