人生苦短,我用python

2022-09-15 06:00:44

導航

  • 報表!報表!
  • 程式碼去哪兒了
  • 亂碼
  • 複雜查詢
  • 人生苦短,我用python
  • 實戰案例
  • 結語
  • 參考

本文共計3252字,感謝您的閱讀,預計閱讀時長3min。

人生苦短,我用python。

第一次接觸pyton是在2018年底。那一年,去了一家做AI教育的公司。

那一年,也是人工智慧風靡的一年。因為大部分的AI庫都是基於Python的,所以python也被炒得熱乎朝天。

真正下定決心開啟python之旅,其實是兩年之後。一部分原因是在學習推薦演演算法,而更重要的原因是為了應對各種繁雜的資料包表。

報表!報表!

離開上家公司之後,去了另外一家新興行業的創業公司。

因為所在專案組是新成立的,所以前期老闆會要求匯出資料包表。當然,隨著業務的不斷髮展,這種需求幾乎一直都有。

人工匯出報表,總是讓人不堪其擾。

而這種需求總是不固定的。有些報表是臨時的,有些報表可能會使用幾個月。

好不誇張地說,這年寫的報表超過了過去職業生涯的總和。

最可氣的是,這種匯出報表,在領導們看來了就是寫幾句sql的事情,沒有必要體現在工作任務中。

程式碼去哪兒了

我們平時其實都會忙於正式的工作——專案的編碼。

所以,這些專案都是會提交到git倉庫。

而那些臨時性的報表需求,簡單一點的我就寫個sql處理了,複雜一點的會用C#或者Java寫個匯出功能程式碼。

但是,需求繁雜,管理也不夠正式。當下次同樣的需求來的時候,又會滿世界去找程式碼...

亂碼

有人說,很多資料庫使用者端工具也能匯出資料到excel? 沒有必要寫程式匯出。

但是,有的匯出之後,在本機開啟是正常的,傳送給別人就成了亂碼。

這裡還是建議是用程式匯出,可以設定合適的格式。

複雜查詢

報表本身用於資料分析。資料庫的設計總是很難滿足不同維度的資料匯出,又說一些複雜的報表,往往需要超過3張以上資料庫表才能完成。

聯表的複雜度就不用多說,如果有些表資料太大,sql執行超時也是很普遍的。

而程式處理,顯得更加靈活。

人生苦短,我用python

對比了多種語言,踩過了無數的坑,最終發現python這一利器。

python具備很多優點:

  • 簡單易學:相對於java等,語法更簡單,更易上手,適用於程式設計初學者。
  • 資料分析資料探勘:海量資料的處理是 Python 的強項。
  • 輕量:隨手寫一個python檔案即可執行。如果使用C#或者Java,需要構建一個專案。

特別適合做資料統計和分析。

實戰案例

需求:

匯出2018-11-12~2019-01-01時間段內的文章到excel表格,欄位如下:

文章ID 文章型別 標籤 標題 建立時間

使用Python來實現,比較簡單,這裡給出一個萬能模板,您只需要更改資料庫連線,sql即可。

#_*_coding:utf-8_*_
#匯入pymysql的包
import pymysql
import pymysql.cursors

# 匯入excel操作包
import xlwt
from datetime import datetime


def get_data(sql):
    # 建立資料庫連線
    #獲取一個資料庫連線,注意如果是UTF-8型別的,需要制定資料庫
    #port 必須是數位不能為字串
    #conn=pymysql.connect(host='localhost',user='root',password='bhwcu2a9',db='passbook',port=3306,charset='utf8')
    conn = pymysql.connect(
        host='localhost',
        user='root',
        password='zhikecore123',
        db='zhike_street',
        port=3306,
        charset='utf8')
    #conn=pymysql.connect(host='ec2-161-189-70-43.cn-northwest-1.compute.amazonaws.com.cn',user='meb_im',password='nvfoFPR4hnQZfeGkCwBN',db='meb_im',port=3306,charset='utf8')
    # 建立遊標
    cur = conn.cursor()
    # 執行查詢,
    cur.execute(sql)
    # 由於查詢語句僅會返回受影響的記錄條數並不會返回資料庫中實際的值,所以此處需要fetchall()來獲取所有內容。
    result = cur.fetchall()
    #關閉遊標
    cur.close()
    #關閉資料庫連線
    conn.close
    # 返給結果給函數呼叫者。
    return result


def getResult(name):
    # 將sql作為引數傳遞呼叫get_data並將結果賦值給result,(result為一個巢狀元組)
    sql = """
 

SELECT 
  `Id`,
  `ArticleTypeName`,
  `Tags`,
  `Title`,
  `CreateTime` 
FROM
  `article` 
WHERE createtime > '{dtBegin}' 
  AND createtime < '{dtEnd}' 


"""
    info = {'dtBegin': '2018-11-12','dtEnd':'2019-01-01'}  # 引數是字典型別
    sql = sql.format(**info)
    print(sql)
    result = get_data(sql)
    # 範例化一個Workbook()物件(即excel檔案)
    wbk = xlwt.Workbook()
    # 新建一個名為Sheet1的excel sheet。此處的cell_overwrite_ok =True是為了能對同一個單元格重複操作。
    sheet = wbk.add_sheet('Sheet1', cell_overwrite_ok=True)

    # 表頭
    header_row = ["文章ID", "文章型別", "標籤", "標題", "建立時間"]

    # 獲取當前日期,得到一個datetime物件如:(2016, 8, 9, 23, 12, 23, 424000)
    today = datetime.today()
    # 將獲取到的datetime物件僅取日期如:2016-8-9
    today_date = datetime.date(today)
    # 遍歷result中的沒個元素。
    for i in range(len(result)):
        data = [result[i][0], result[i][1],result[i][2],result[i][3],result[i][4]]
        if i==0:
            for j in range(len(header_row)):
                # 第一個引數代表行,第二個引數是列,第三個引數是內容,第四個引數是格式
                sheet.write(i, j, header_row[j])
        #對result的每個子元素作遍歷,
        for k in range(len(data)):
            sheet.write(i+1, k, data[k])
    # 以傳遞的name+當前日期作為excel名稱儲存。
    wbk.save(name + str(today_date) + '.xls')


# 如果該檔案不是被import,則執行下面程式碼。
if __name__ == '__main__':
    getResult('_article_static')


程式碼中幾乎每行都有註釋,這裡不再贅述。

至此,程式碼已經編寫完成,我們儲存為_article_static_with_header.py檔案。

接下來,就是讓程式碼run起來,匯出到excel。

這裡需要注意的是,我們需要提前搭建好python的執行環境。新手同學可以參考《Python安裝和使用教學(windows)》

我這裡使用的編輯器是VS Code,推薦您也使用。

上面的程式碼用VS Code 編輯器開啟之後,執行



執行之後,生成了一個excel檔案。



資料就已經匯出成功了。

結語

python對於資料處理具有天然優勢,比如它的pandas,非常強大。有興趣的同學可以進一步研究。

在實際使用過程中,一個檔案就可以處理一個報表需求,管理也很方便。

在巨量資料時代,資料分析已經變得越來越受重視,如果您需要經常需要匯出報表或者想成為一名資料分析工程師,那就趕快入手python吧!

參考