零基础学编程019:生成群文章目录
在2016年10月底,我建立了“分享与成长群”,每人在每月都要输出一篇原创文章,一开始人数不多,汇总成PDF的工作量并不大,但现在人数已经超过70人了,该写个程序来解决这种重复性的工作了。
最终问题描述:
群分享的文章已经用Mikecrm表单工具采集到一个xls文件中,包含“姓名、文章标题、文章链接”三列,想生成一份所有文章的合集,用PDF格式分享出来。
可以在公众号后台输入“群分享”,看看以前几期的群分享PDF文档。
XLS文件样例
问题分解:
直接生成Doc或PDF相当有难度,根据《怎样解题》的策略,面对相对复杂的问题,首先要办法把问题分解为多个简单的过程,我把该问题分解为两步:
- 第一步:先根据XLS生成一份HTML文章目录,点击文末左下角的“阅读原文”看输出的最终效果
- 第二步:再利用开源的转换工具生成DOC或PDF,我已经有思路,正在试验中,以后再发布
本次先解决第一步的问题。对于编程新手来说,这一步也具有相当的难度,仍需要进一步地分解。最主要的难点在于编程新手很可能缺少读取文件、CSV、Makrdown、HTML等知识背景。
- 把XLS手工转换为CSV文件
- 写Python程序,把CSV转换为Markdown格式
- 把Markdown复制在“简书”平台中,即可直接发布,完成任务
什么是CSV?
就是一种逗号分隔的文本文件(Comma-Separated Values),详细内容请自行百度。
为什么不直接读XLS?
读文本文件相对容易些,Python中内置有专门的读取CSV的函数库,容易上手。当然也能找到读取XLS的函数库,但门槛相对高一些。
什么是Markdown?为什么不直接用HTML?
HTML是网页的描述语言,但它的描述太啰嗦了,而Markdown就相当简洁,可以让人专心写文章,减少排版的干扰,详细内容请自行百度吧。
试着读取csv
假设201701.csv文件存放在D盘根目录下,百度一下python中的csv读取教程,原来只需要4行,就可以读出其全部内容。
import csv
reader = csv.reader(open('d:/201701.csv')) for line in reader : print(line)
网上查到的许多文章中写的是下面这行语句,在Python 3中运行会报错。
reader = csv.reader(open('d:/201701.csv', 'rb'))
这里先不介绍open函数的具体意思,有经验的C程序员看见 'rb' 可以猜出问题的原因。
用markdown表示的超链接
我们想要让文章标题显示为一个超链接,点击后跳转到文章的http超链接。在markdown中是这样表达的,非常简洁。
[title](URL)
举个例子:
[45岁大叔的5年GTD旅程](http://mp.weixin.qq.com/s/F9pTuAkoDCXAaWvqDGcTFA)
把这段文字放在简书中(请开启markdown选项),发布之后,就会看到一个超链接:45岁大叔的5年GTD旅程。
最终代码:
import csv
reader = csv.reader(open('d:/201701.csv')) for line in reader : name = line[0] #第一列是姓名 title = line[1] #第二列是标题 url = line[2] #第三列是链接 print(name, "[" + title + "](" + url + ")" )
总共写了7行代码,中间三行是为了让新手看明白,实际上用4行代码就够了。运行程序后,输出的内容是这样的:
把这些文字复制到简书平台,发布,完成任务。请点击文末左下角的“阅读原文”看最后生成的网页效果。
小结:
- 问题描述:xls -> pdf
- 分步解决:xls -> csv -> markdown -> html -> pdf
- 首先解决:csv -> markdown,其它步骤用手工解决
- csv是逗号分隔的文本文件,用文本编辑器可以查看
- import csv 用于导入csv函数库
- csv.reader 可以直接读入csv文件,形成一个列表
- 在markdown语法中,[title](URL) 表示超链接
- 用print 语句拼出想要的文本
- 把markdown文本复制到简书中,发布为html网页
--- END ---
- Android 程序打包及签名
- 韩伟:解谜腾讯游戏海量服务架构
- Message和handler传递对象
- MVC RC2中关于HtmlHelper给DropDownList设置初始选中值的问题
- 结构struct(值类型)在实际应用要注意的二点:
- 王璋:腾讯云为游戏行业提供解决方案
- 利用Reflector把"闭包"看清楚
- CSS伪类的三种写法
- 吴晓斌:"吃鸡"游戏全球多地部署架构分析
- silverlight + wcf(json格式) + sqlserver存储过程分页
- 联众收购多家公司 多枚域名齐助阵
- Android AlertDialog去除黑边白边自定义布局(转)
- “超自然”域名近139万易主
- 服务器磁盘监控脚本分享(含报警邮件)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法