Python/MySQL實(shí)現(xiàn)Excel文件自動(dòng)處理數(shù)據(jù)功能
問題描述
在沒有服務(wù)器存儲(chǔ)數(shù)據(jù),只有excel文件的情況下,如何利用SQL和python實(shí)現(xiàn)數(shù)據(jù)分析和數(shù)據(jù)自動(dòng)處理的功能?
例如:消費(fèi)者購(gòu)買商品時(shí),會(huì)挑選商品然后再對(duì)商品付款?,F(xiàn)在需要查找出用戶挑中但是沒有付款的商品并標(biāo)識(shí)為未下單,付款的商品標(biāo)注為下單。并且每隔一段時(shí)間自動(dòng)執(zhí)行上述操作。
目的:定時(shí)抽取上面的數(shù)據(jù)分析用戶購(gòu)買商品的行為。對(duì)比付款和選中未下單的商品的性能、價(jià)格等信息來發(fā)掘用戶喜好,從而提高選品下單率。
注意:
- 用戶的信息主要以excel的形式存儲(chǔ),沒有服務(wù)器。
- 商品表里面存了用戶挑選的商品信息。
- 訂單表里面存了用戶付款的商品信息。
解決方案
一、SQL查詢
首先想到的是利用SQL語言實(shí)現(xiàn)這樣的查詢。具體實(shí)現(xiàn)過程如下:
(1) 建立dingdan表和shangpin表:
-- ----------------------------
-- Table structure for dingdan
-- ----------------------------
DROP TABLE IF EXISTS `dingdan`;
CREATE TABLE `dingdan` (
`d_id` int(11) NOT NULL,
`UPC` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`d_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of dingdan
-- ----------------------------
INSERT INTO `dingdan` VALUES (1, '6972470560664');
INSERT INTO `dingdan` VALUES (2, '6972470560664');
INSERT INTO `dingdan` VALUES (3, '6972470561227');
INSERT INTO `dingdan` VALUES (4, '6972470561890');
INSERT INTO `dingdan` VALUES (5, '6972470561906');
SET FOREIGN_KEY_CHECKS = 1;
-- ----------------------------
-- Table structure for shangpin
-- ----------------------------
DROP TABLE IF EXISTS `shangpin`;
CREATE TABLE `shangpin` (
`UPC` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`商品` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`UPC`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of shangpin
-- ----------------------------
INSERT INTO `shangpin` VALUES ('6972470560657', 'A');
INSERT INTO `shangpin` VALUES ('6972470560664', 'A');
INSERT INTO `shangpin` VALUES ('6972470561210', 'D');
INSERT INTO `shangpin` VALUES ('6972470561227', 'B');
INSERT INTO `shangpin` VALUES ('6972470561890', 'C');
INSERT INTO `shangpin` VALUES ('6972470651791', 'B');
SET FOREIGN_KEY_CHECKS = 1;


(2) 將excel數(shù)據(jù)導(dǎo)入SQL軟件中。
執(zhí)行下面的查詢語句進(jìn)行查找:
-- 搜索未下單的商品信息 SELECT *, if(bb.UPC IS NULL,'未下單', '下單') as 下單情況 FROM shangpin aa LEFT JOIN dingdan bb ON aa.UPC = bb.UPC
得到以下查詢結(jié)果:

(3) 將搜索結(jié)果導(dǎo)出為excel。
(4) 隔一段時(shí)間,需要人工重復(fù)上面的操作。
二、SQL、python處理
利用SQL查詢、python做定時(shí)處理。具體實(shí)現(xiàn)過程如下:
(1) 重復(fù)方案1中的步驟1和2,將數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)中。
(2) 用python連接數(shù)據(jù)庫(kù)并查找數(shù)據(jù)。
import pymysql #導(dǎo)入PyMySQL庫(kù)
import datetime
import warnings
import pandas as pd
import matplotlib.pyplot as plt
warnings.filterwarnings('ignore')
# 1. 連接數(shù)據(jù)庫(kù),創(chuàng)建連接對(duì)象 db
# 連接對(duì)象作用是:連接數(shù)據(jù)庫(kù)、發(fā)送數(shù)據(jù)庫(kù)信息、處理回滾操作(查詢中斷時(shí),數(shù)據(jù)庫(kù)回到最初狀態(tài))、
# 創(chuàng)建新的光標(biāo)對(duì)象
def connect_database(database, password):
db = pymysql.connect(host ="localhost", #host屬性
user ="sys", #用戶名
password = password, #此處填登錄數(shù)據(jù)庫(kù)的密碼
database = database, #數(shù)據(jù)庫(kù)名
charset="utf8" # 如果中文顯示亂碼,則需要添加charset = "utf8"
)
return db
def read_data(db):
# 2. 使用 cursor() 方法創(chuàng)建一個(gè)游標(biāo)對(duì)象 cursor
cursor = db.cursor()
# 3. 利用MySQL語句查找數(shù)據(jù)并轉(zhuǎn)化為FrameData(包含列名)
try:
# 使用 execute() 方法執(zhí)行 SQL 查詢
mysql = "SELECT *, if(bb.UPC IS NULL,'未下單', '下單') as 下單情況 FROM shangpin aa LEFT JOIN dingdan bb ON aa.UPC = bb.UPC" # SQL語句
cursor.execute(mysql)
data = cursor.fetchall()
# 下面為將獲取的數(shù)據(jù)轉(zhuǎn)化為 dataframe 格式
columnDes = cursor.description #獲取連接對(duì)象的描述信息
#print("cursor.description中的內(nèi)容:",columnDes)
columnNames = [columnDes[i][0] for i in range(len(columnDes))] #獲取列名
df = pd.DataFrame([list(i) for i in data],columns=columnNames) #得到的data為二維元組,逐行取出,轉(zhuǎn)化為列表,再轉(zhuǎn)化為df
print(df)
"""
db.commit()若對(duì)數(shù)據(jù)庫(kù)進(jìn)行了修改,需進(jìn)行提交之后再關(guān)閉
"""
# 提交到數(shù)據(jù)庫(kù)執(zhí)行
#db.commit()
#print("OK")
except:
# 如果發(fā)生錯(cuò)誤則回滾
db.rollback()
print("失敗")
"""
使用完成之后需關(guān)閉游標(biāo)和數(shù)據(jù)庫(kù)連接,減少資源占用,cursor.close(),db.close()
db.commit()若對(duì)數(shù)據(jù)庫(kù)進(jìn)行了修改,需進(jìn)行提交之后再關(guān)閉
"""
# 關(guān)閉數(shù)據(jù)庫(kù)連接
cursor.close()
db.close()
return df
(3) 做定時(shí)任務(wù)
## 定時(shí)任務(wù)
import time
from apscheduler.schedulers.blocking import BlockingScheduler
def job():
dt = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
print('{} --- {}'.format(text, t))
database = 'sys' #數(shù)據(jù)庫(kù)名稱
password = 'sys' #數(shù)據(jù)庫(kù)用戶密碼
db = connect_database(database, password)
data_sp = read_data(db)
data_sp.to_excel('../data/data_ans.xlsx', sheet_name='未下單情況')
scheduler = BlockingScheduler()
# 在每天22和23點(diǎn)的25分,運(yùn)行一次 job 方法
scheduler.add_job(job, 'cron', hour='22-23', minute='25')
scheduler.start()
## 測(cè)試
# 執(zhí)行任務(wù)
def time_printer():
# 輸出時(shí)間
now = datetime.datetime.now()
ts = now.strftime('%Y-%m-%d %H:%M:%S')
print('do func time :', ts)
# 定時(shí)任務(wù)
def loop_monitor():
while True:
time.sleep(20) # 暫停20秒
if __name__ == "__main__":
loop_monitor()
打開data_ans的excel文件即可查看數(shù)據(jù)。
程序需要一直運(yùn)行,如果因?yàn)殛P(guān)機(jī)導(dǎo)致程序終止,需要重新運(yùn)行。
三、python處理
python處理。具體實(shí)現(xiàn)過程如下:
(1) 導(dǎo)入excel數(shù)據(jù)并利用python完成數(shù)據(jù)查詢,以excel的形式導(dǎo)出查詢好的數(shù)據(jù)。
? 參考
import pandas as pd
def taskTime():
## 1. 分別導(dǎo)入2個(gè)表的數(shù)據(jù)
product = pd.read_excel('d:/python_code/crontab/data/taskdata.xlsx', sheet_name='商品') # 換成自己的路徑和sheet名稱
order = pd.read_excel('d:/python_code/crontab/data/taskdata.xlsx', sheet_name='訂單')
## 2. 抽取數(shù)據(jù)
product=product.rename(columns={'UPC':'ID'}) # 對(duì)商品表里面的UPC重命名未ID(為了保留訂單表里面的CPU著一列)
PO=pd.merge(product,order,left_on='ID', right_on='UPC',how='left') # 左連接抽取數(shù)據(jù)
PO.loc[pd.isnull(PO['UPC']), '下單情況'] = '未下單' # 找到選中但是未下單的數(shù)據(jù)標(biāo)注為未下單
PO['下單情況'] = PO['下單情況'].fillna(value='下單') # 找到下單的數(shù)據(jù),在'下單情況'這一列中標(biāo)注為下單
## 3. 以excel的形式導(dǎo)出查詢好的數(shù)據(jù)
PO = PO.loc[:, ['ID', 'UPC', '下單情況', '產(chǎn)品名稱E', '產(chǎn)品參數(shù)C', '價(jià)格', '建議零售價(jià)','訂單日期', '品牌', 'PO#', 'SKU','配置', '單價(jià)', '數(shù)量', '銷售金額', '成本單價(jià)', '成本', '成本價(jià)含稅/未稅']] # 按列名導(dǎo)出需要的數(shù)據(jù)
PO.to_excel('d:/python_code/crontab/data/data_python.xlsx', sheet_name='未下單情況') # 導(dǎo)出excel表
return PO
if __name__ == "__main__":
taskTime()
print('執(zhí)行成功')
(2) 定時(shí)處理
## 2. 定時(shí)處理
import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
def job():
now = datetime.datetime.now()
ts = now.strftime('%Y-%m-%d %H:%M:%S')
print('執(zhí)行時(shí)間 :', ts) # 輸出時(shí)間
taskTime() # 執(zhí)行代碼
scheduler = BlockingScheduler() ## 定時(shí)
# 在每天17和23點(diǎn)的25分,運(yùn)行一次 job 方法
scheduler.add_job(job, 'cron', hour='17-23', minute='22')
scheduler.start()
打開data_python的excel文件即可查看數(shù)據(jù)。
程序需要一直運(yùn)行,如果因?yàn)殛P(guān)機(jī)導(dǎo)致程序終止,需要重新運(yùn)行。
四、優(yōu)化python處理
1.手動(dòng)執(zhí)行代碼
如果電腦需要關(guān)機(jī),這時(shí)候代碼不能一直運(yùn)行,只能在需要數(shù)據(jù)的時(shí)候執(zhí)行一下代碼。有以下2個(gè)執(zhí)行方法:
(1)用命令行執(zhí)行代碼,具體操作如下:
win + R 輸入cmd 再輸入 路徑以及文件名
python d:\python_code\crontab\code\test.py
見下圖

注意:數(shù)據(jù)還有代碼的路徑要寫對(duì)
如果不想用命令行。直接用.bat文件執(zhí)行也可以。
首先,需要新建一個(gè).bat文件(用來運(yùn)行腳本),在這個(gè)文件里面寫上如下代碼后保存:
python 路徑\文件名.py

將這個(gè)文件放到桌面,使用時(shí)點(diǎn)擊即可。
2.開機(jī)自動(dòng)執(zhí)行代碼
將已經(jīng)保存的.bat文件復(fù)制到該目錄(C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup)下,可能殺毒軟件會(huì)阻止,選擇允許,然后重啟電腦即可。
注:開機(jī)自啟以后會(huì)打開一個(gè)cmd窗口,關(guān)閉窗口,python程序?qū)⑼V惯\(yùn)行。
注意:開啟自啟動(dòng)可能會(huì)讓電腦變慢、發(fā)熱。。。
對(duì)比四種方案
| 方案名稱 | 優(yōu)點(diǎn) | 缺點(diǎn) |
|---|---|---|
| SQL查詢 | 代碼簡(jiǎn)單,實(shí)現(xiàn)簡(jiǎn)單 | 數(shù)據(jù)一旦更新需要執(zhí)行導(dǎo)入導(dǎo)出excel的操作。并且需要手動(dòng)操作,不能自動(dòng)提醒。 |
| SQL、python處理 | 避免導(dǎo)出excel;可以自動(dòng)提醒 | 還是需要導(dǎo)入excel;同時(shí)操作SQL和python;自動(dòng)提醒需要程序一直運(yùn)行 |
| python處理 | 避免導(dǎo)入導(dǎo)出;可以自動(dòng)提醒,只操作python | 查詢時(shí)的處理不好做(對(duì)新手來說);自動(dòng)提醒需要程序一直運(yùn)行 |
| 優(yōu)化python處理 | 避免導(dǎo)入導(dǎo)出;自動(dòng)提醒不需要程序一直運(yùn)行,開機(jī)自啟動(dòng) | 需要配置一下 |
總結(jié)
在沒有服務(wù)器,以excel存儲(chǔ)數(shù)據(jù)的情況下,同樣可以利用SQL和python來做數(shù)據(jù)處理和分析,在遇到excel處理數(shù)據(jù)特別麻煩的時(shí)候可以選擇上面的方案做處理,即可以鍛煉自己的SQL和python編程的能力,又可以高效地解決問題。
到此這篇關(guān)于Python/MySQL實(shí)現(xiàn)Excel文件自動(dòng)處理數(shù)據(jù)功能的文章就介紹到這了,更多相關(guān)Python Excel自動(dòng)處理數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python從Excel讀取數(shù)據(jù)并使用Matplotlib繪制成二維圖像
- python批量翻譯excel表格中的英文
- Python+Requests+PyTest+Excel+Allure?接口自動(dòng)化測(cè)試實(shí)戰(zhàn)
- 14個(gè)Python處理Excel的常用操作分享
- Python實(shí)現(xiàn)將Excel內(nèi)容插入到Word模版中
- python實(shí)現(xiàn)Excel多行多列的轉(zhuǎn)換的示例
- Python?Excel數(shù)據(jù)處理之xlrd/xlwt/xlutils模塊詳解
- 如何在Python中導(dǎo)入EXCEL數(shù)據(jù)
相關(guān)文章
Python讀取配置文件-ConfigParser的二次封裝方法
這篇文章主要介紹了Python讀取配置文件-ConfigParser的二次封裝方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Python排序方法中sort和sorted的區(qū)別詳解
在python中常用的排序函數(shù)就是sort()和sorted()這兩個(gè)函數(shù),使用 sort() 或內(nèi)建函數(shù) sorted() 對(duì)列表進(jìn)行排序,本文將詳細(xì)介紹sorted和sort兩者之間的區(qū)別,感興趣的可以了解一下2023-08-08
Python調(diào)用Windows API函數(shù)編寫錄音機(jī)和音樂播放器功能
這篇文章主要介紹了Python調(diào)用Windows API函數(shù)編寫錄音機(jī)和音樂播放器功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
Python實(shí)現(xiàn)批量更換指定目錄下文件擴(kuò)展名的方法
這篇文章主要介紹了Python實(shí)現(xiàn)批量更換指定目錄下文件擴(kuò)展名的方法,結(jié)合完整實(shí)例分析了Python批量修改文件擴(kuò)展名的技巧,并對(duì)比分析了shell命令及scandir的兼容性代碼,需要的朋友可以參考下2016-09-09
Python可以實(shí)現(xiàn)棧的結(jié)構(gòu)嗎
在本篇文章里小編給各位整理的是關(guān)于Python實(shí)現(xiàn)棧的結(jié)構(gòu)的條件的相關(guān)知識(shí)點(diǎn),有需要的朋友們可以學(xué)習(xí)下。2020-05-05
keras如何指定運(yùn)行時(shí)顯卡及限制GPU用量
這篇文章主要介紹了keras如何指定運(yùn)行時(shí)顯卡及限制GPU用量問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
python判斷鏈表是否有環(huán)的實(shí)例代碼
在本篇文章里小編給大家整理的是關(guān)于python判斷鏈表是否有環(huán)的知識(shí)點(diǎn)及實(shí)例代碼,需要的朋友們參考下。2020-01-01
在Python下利用OpenCV來旋轉(zhuǎn)圖像的教程
這篇文章主要介紹了在Python下利用OpenCV來旋轉(zhuǎn)圖像的教程,代碼和核心的算法都非常簡(jiǎn)單,需要的朋友可以參考下2015-04-04

