1. 程式人生 > 其它 >零基礎學程式設計039:生成群文章目錄(2)

零基礎學程式設計039:生成群文章目錄(2)

每個月的月底,“分享與成長群”要彙總所有成員的原創文章,這次我改用了水滴微信平臺把資料採集到一個電子表格檔案中。在《零基礎學程式設計019:生成群文章目錄》這一節裡,我已經可以用讀csv文字檔案的辦法,配合markdown語法自動生成所有文章的目錄。

但這次情況發生了幾點變化:

  • 直接讀取xlsx的電子表格會更方便
  • 有些人想用筆名來署名,不顯示真實姓名
  • 有些文章暫時不方便對外公開,不顯示超連結
  • 有些人會多次提交,以最後一次的文章為準。比如下圖中的第120、127行是同一人的,只保留第127行

這次程式想直接讀取電子表格,省掉轉換csv這一步,查了一下相關資料,python中讀xls或xlsx的模組庫非常多,主要可選的是xlrd和pyexcel等,最後我選定了pandas,因為pandas也是依賴xlrd來讀取電子表格,並且將來還可以做更為強大的資料分析,學pandas絕對用得上。

讀電子表格很方便,用read_excel()函式。

import pandas as pd

df = pd.read_excel("d:/分享與成長群/201703.xlsx")

xlsx原始檔案中文章是按提交日期反序排列的,我想讓先提交的文章排在前面,因此需要將資料集按“序號”從小到大排序。

df = df.sort("序號")

刪除重複資料,我使用了谷歌,找到了drop_duplicates()函式,一行程式碼搞定。意思是:如果“姓名”這一列相同,表示是重複記錄,keep='last'表示只保留最後出現一條記錄。

df = df.drop_duplicates('姓名', keep='last')

這個pandas採用了與R語言類似的DataFrame設計,功能非常強大,可以根據設定的條件快速地選出所需的行和列。因為我已經學過R語言,看了一下pandas的快速入門,就找到了這條語句:

df = df.loc[:, ["姓名", "文章標題", "文章超連結", "是否公開文章的連結?", "筆名"]]

原表格中還包括openid、填寫時間、IP地址、備註等列,對於我的文章彙總沒有用處,而真正有用的就是"姓名"、"文章標題"、"文章超連結"、"是否公開文章的連結?"、"筆名"這五列。

再下來就是逐行迴圈處理了,pandas應該有更理想的處理辦法,但我現在還沒學到。

str = ""
for line in df.values :
    name = line[0] 
    title = line[1]  
    url = line[2]  
    public = line[3]
    penName = line[4]

    if(pd.notnull(penName)) :
        name = penName

    str += "1. " + name + ": "
    if(public == '不公開') :
        str += title + "n";
    else :
        str += "[" + title + "](" + url + ")n" 

生成的文字是Markdown格式(點這裡瞭解Markdown),還可以更懶一些,把生成的文字直接複製到剪貼簿中,從stackoverflow上抄來程式碼:

from tkinter import Tk
r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append(str)
r.destroy()

現在只需要到簡書上貼上,併發布就OK了。

小結:

  • 軟體需求永遠在變,程式也要不斷迭代
  • pandas的read_excel()可直接讀取xls和xlsx的電子表格
  • DataFrame很強大,可以選行或選列,用.loc[ ]
  • sort()排序
  • drop_duplicates()去掉重複的行

--- END ---