每个月的月底,“分享与成长群”要汇总所有成员的原创文章,这次我改用了水滴微信平台把数据采集到一个电子表格文件中。在《零基础学编程019:生成群文章目录》这一节里,我已经可以用读csv文本文件的办法,配合markdown语法自动生成所有文章的目录。
但这次情况发生了几点变化:
这次程序想直接读取电子表格,省掉转换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了。
小结:
--- END ---