零基础学编程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 ---

原文发布于微信公众号 - 申龙斌的程序人生(slbGTD)

原文发表时间:2017-03-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PHP实战技术

Linux下自动化监控内存、存储空间!

距离上一次更新文章已经过去一段时间了,小编在这段时间因为一些琐事,加上身体生病不能及时更新文章,今天身体逐渐恢复就急忙来更新文章,今天思梦给大家...

3146
来自专栏丑胖侠

《Drools7.0.0.Final规则引擎教程》第4章 4.3 定时器

定时器 规则用基于 interval(间隔)和cron的定时器(timer),替代了被标注过时的duration 属性。timer属性的使用示例: time...

2059
来自专栏零基础使用Django2.0.1打造在线教育网站

零基础使用Django2.0.1打造在线教育网站(二十四):全局页面配置

努力与运动兼备~~~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!

943
来自专栏数据和云

疑难解答:ORA-01555的场景模拟和解决方案

黄玮(Fuyuncat) 资深Oracle DBA,个人网站www.HelloDBA.com,致力于数据库底层技术的研究,其作品获得广大同行的高度评价. 前期...

2665
来自专栏信安之路

MetInfo 最新版代码审计漏洞合集

最近想给 X 天贡献点插件,时常会去留意 seebug 的最新漏洞列表,发现最近 MetInfo 的漏洞上座率蛮高的,就挑它来代码审计了一波。

941
来自专栏后端之路

mysql的query end status

背景 由于业务中有备份某个业务表的定时任务 会在每天指定时间点做一次备份【使用quartz】 各位也都知道各种timeout的相关问题 socketTimeou...

4126
来自专栏Django中文社区

支持 Markdown 语法和代码高亮

为了让博客文章具有良好的排版,显示更加丰富的格式,我们使用 Markdown 语法来书写我们的博文。Markdown 是一种 HTML 文本标记语言,只要遵循它...

2897
来自专栏皮振伟的专栏

[linux][memory]进程的最大内存使用量的讨论

前言: 一个进程最大能使用多少虚拟内存,能控制的地方还是比想象的多一点。 尤其是IaaS上,一个qemu进程能使用多少虚拟内存,就是对应着虚拟机的物理内存的最大...

66011
来自专栏乐沙弥的世界

Python语言编译器与解释器

版权声明:本文为博主原创文章,欢迎扩散,扩散请务必注明出处。

682
来自专栏技术分享

.NET/ASP.NET 4.5 Bundle组件(捆绑、缩小静态文件)

阅读目录: 1.开篇介绍 2.System.Web.Optimization 组件 3.System.Web.Optimization 组件基本原理 4.扩展自...

1807

扫码关注云+社区