作者:李禹锋,重庆芝诺大数据分析有限公司数据挖掘工程师。
先来一点题外话,说明一下为什么要改名字。首先呢,许多业外人士对于程序员和工程师都有个误解,虽然都自嘲是码农,但并不代表程序员就是一个社会地位低下的职业。如果没有世界上众多的程序员,我们是享受不到现在如此色彩斑斓的世界的,就拿双十一来说。
![0?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/a579f89f52e380b17b577a96429ad6cc.jpeg)
没有他们的辛勤劳作,请问,您如何剁手呢?计算机语言都是非常精妙的,算法是什么,说白了就是计算的方法,如何使用有限硬件资源进行高效高深的计算。各行各业都有各自的苦楚,正因为当今社会对于有编程能力的人需求极大,而同时并没有那么多的人才供应,所以才导致程序员的大量加班。
2015年,负责苹果软件的副总裁Craig Federighi在出席苹果编程一小时(Hour of Code)活动时强调,编程非常重要,孩子从小就应该接触,未来不会编程就是文盲。现在几乎所有理工科专业大一都会开设编程基础课程,无论是C、C++甚至VF等等。那可能部分朋友会说我是医学的,计算机跟我不搭嘎,那么请问是否听说过前计算机辅助医疗呢?MS Office、CDA、PS、SPSS系列这些软件是谁开发出来的呢?Excel中同样需要使用函数来编程,甚至部分Excel的开发者还需要编写VB代码,Excel的功能您会多少呢?我之前和很多朋友也说过,你要做数据分析,首先学会使用Excel,谢邦昌教授甚至曾编写过如何使用Excel进行数据挖掘的书籍。
![0?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/cc1ecabdc40ecc5cb9fe0d63e61c5c72.jpeg)
(来自百度百科)
![0?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/e14c7f7f44ae1d73f51ca09e0e0ef473.jpeg)
(来自当当网)
同时,需要进行计算机编程的工作就叫程序员吗?前段时间我一个朋友在一家私企找到了一份文职的工作,要求会写html和css,薪资和待遇都还挺不错,那她是不是也该叫做程序员呢?
所以我考虑再三,我们这个系列主要目的是让大家会如何进行数据分析、数据挖掘,使用的主要工具是python,那干脆就直接更名为数据分析师的编程之旅,当然最终目的是数据挖掘工程师、AI工程师。(做数据挖掘也并不仅仅局限于python,R、MATLAB、Java等等工具、语言都能做,我前天还和另一家大数据公司交流Java写的数据挖掘底层代码呢,只是术业有专攻罢了)
本文导读:
![0?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/24c0e8be0d3a3780c46fde876d97352a.png)
吐槽了半天了,下面进入基础部分的最后一个篇,在这白色相簿的季节里,一起正式跨入python的大坑吧。
首先回顾上一篇讲到的模块知识,模块其实是连接底层和上层的接口,计算机底层的东西非常多,所以先来介绍几个python内置操作系统的模块。(接下来的介绍我会直接进行函数和类的列举,倘若不会调用和理解的朋友请看一看前面几篇关于函数、类和模块的讲解)
01
os模块
操作系统的模块。
(1) os.getcwd():获取当前工作路径的绝对路径。(get current work directory)
(2) os.system():执行命令行指令(例如前一篇所说的pip install这种命令),传入系统指令,对于计算机的所有一切操作都可以在命令行里进行(除了关闭状态下开机这个操作)。(这个函数很好用的,以后可以教大家写点批处理脚本,对于Linux的shell脚本交给我的搭档来教大家吧)
(3) os.listdir():获取当前工作路径下的所有文件和文件夹名
(4) os.mkdir():创建一个目录,传入目录名,传入的若不是绝对路径则会使用以当前工作路径起始的相对路径。*绝对路径和相对路径的知识在文末小TIPS里
(5) os.remove():删除指定文件,传入文件路径。
(6) os.rmdir():删除指定目录,传入目录路径。
(7) os.path.isfile():判断指定对象是否是一个文件,是返回真。
(8) os.path.isdir():判断指定对象是否是一个目录,是返回真。
(9) os.name:这是一个参数,不是函数,判断当前系统,Windows返回 nt ,Linux返回 posix。
**上面所说的所有需要传入的参数,全!是!字!符!串!。起个强调作用。目前对于系统的操作其实并不太多,而且Linux系统和Windows系统也有很多差异,特别是文件系统,python底层都做了很好的封装,不过使用不会太多,需要用到的时候可以倒回来看看,上面也仅仅是几个常用的,还有一大堆的函数和类,想要了解的同学可自行help或dir查看模块内容。
02
time模块
系统时间模块。
(1) time.sleep():程序休眠,传入数值,单位为秒。(爬虫里用得挺多的,主要控制爬虫速度和拟人化操作)
(2) time.time():获取当前时间戳。
*时间戳是指从北京时间1970年08时00分00秒起始至现在的总秒数。
(3) time.ctime():不传入参数获取当前系统时间,传入数值(时间戳),则返回相应时间戳日期时间。
**时间模块使用最多的就是如上三个,当然也有一些获取进程运行时间,CPU时间等,以及格式化时间字符格式的相关函数,不过我们不使用python做系统运维,就不多做介绍。
03
sys模块
解释器模块。
*说明一下解释器,解释器就是你python代码运行时是通过什么接口传递给系统底层的,因为底层是机械的0和1,上层语言却更偏向人的语言习惯,中间必须有一个充当翻译的解释器,python底层解释器除了原生的解析器以外还有Java接口的Jython,C语言的CPython,.NET的IronPython,Python自己写的自己的解释器PyPy等等,不过我们使用原生的就好。不同的编辑器会选用不同的解释器,不过通常都是采用的原生解释器。
(1) sys.path:参数,获取当前程序搜索模块的路径,第一个值””是代表当前路径,该参数是一个列表,可使用append函数自行添加搜索模块的路径。
(2) sys. getdefaultencoding():获取解释器默认编码 *还记得讲字符串的时候吐槽的编码问题吗?
(3) sys.version:参数,获取当前python版本信息,解释器信息。
(4) sys.argv:参数,获取命令行参数,第0个是脚本路径,第1个往后是添加的参数。
*上一节中讲到的从GitHub上下载的项目安装时,在命令行界面使用python setup.py install这个指令来进行安装,下面我用一个小例子来实现这个功能,当然安装过程用print代替。
首先在C盘根目录下新建一个test.py脚本(创建一个txt文本,把后缀名txt改成py即可),使用python自带的IDLE输入代码即可。
![0?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/5675668211d0444400b8cffae4d5f76a.png)
打开命令行,输入cd c:\命令进入到C盘根目录。执行python脚本(想要测试的同学一定要先将原始安装的python加载进环境变量中,不会添加的同学可进行留言)。
![0?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/3631a1a14e9e92b6f0dc430f317e98ee.png)
**该模块也有很多其他的用法,目前了解到这里就足够了,其实也不会使用太多,只是给大家介绍一下这些接口,之前也说过嘛,写程序就是需要先了解有什么东西,再具体进行实现,其他编程语言也是操作这些东西,只是使用的函数名、参数名不同。
04
threading模块
线程模块。
*现在理解不了无所谓,当做一个可以能够更加有效使用硬件资源的模块即可,多线程编程在现在算是一个非常火的概念,可高效的运用CPU,使得程序在宏观上是并行的。
其中最重要的是Thread类,可以通过Thread类创建新的进程。
Thread(target=目标函数,args=(参数1,参数2,…,),…)
通过Thread.setDaemon(True)来设置守护进程(设置了保险一些)
然后使用Thread.start()来开启进程。详细我拿一个单线程和多线程程序来进行一个演示。
![0?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/86ad9d86ebdddd6d5ebea399199a1a1a.png)
![0?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/2db3afe6a85ca6094bb7bcac6a48c411.jpeg)
单线程程序打印结果一目了然,f1执行完再执行f2,最后打印程序结束。但是多线程打印结果看起来会有一些懵逼,启动进程t1和t2之后并不会等待程序执行结束就直接执行接下来的程序,所以打印出了程序运行结束,而下方第1次运行两个进程都打印出了两次,这其实是内部的一个机制,暂时不用理解,只需要看整个程序执行结束的时间差。单线程程序总耗时10秒,多线程总耗时仅3秒。宏观来看,程序实现了并行运算。(和分布式计算的并行运算宏观来看差不多,但微观来看是两个截然不同的东西)目前不懂无需纠结,之后多线程爬虫和分布式爬虫时会详细进行讲解(区别于多进程)。
05
math模块
数学模块。
常用数学函数:
ceil(x):传入数值,使用进一法取近似值
floor(x):传入数值,使用去尾法取近似值
fabs(x):传入数值,返回绝对值
exp(x):等同于e**x
pow(x,y):等同于x**y
sqrt(x):等同于x**0.5,开平方根
degrees(x):把弧度值x转换为角度值
radians(x):把角度值x转换为弧度值
isfinite(x):检测是否有界
isinf(x):检测是否无界
isclose(x,y):检测两个数值是否相近,精度达小数点后8位以上
三角函数:cos(x)、sin(x)、tan(x)
反三角函数:acos(x)、asin(x)、atan(x)、atan2(x,y)
*atan传入一个数值,返回反正切的弧度值
*atan2传入一个坐标,返回反正切值
双曲函数:cosh(x)、sinh(x)、tanh(x)、acosh(x)、asinh(x)、atanh(x)
对数函数:log(x,a)、log10(x)、log1p(x)、log2(x)
超越数常量:e、pi、tau
**还有很多,不过math模块中的函数名和真实函数名差异不大。
06
random模块
随机模块。
random():无参数,返回0~1间的一个随机数。
randint(x,y):传入两个数值,返回x~y间一个随机整数
randrange(x,y,s):传入起始值x,终止值y,步长s,从生成的列表中随机选择一个数。
shuffle():传入列表,返回打乱顺序的列表
choice():传入列表,返回一个随机选择
sample(l,n):传入列表l和数值n,从列表l中独立随机抽取n个元素
gauss():生成高斯分布
normalvariate():生成正态分布
seed():保存随机数序列
**依旧还有很多,不过列举出来的使用最多了。
07
re模块
正则模块。
*曾经有大佬说过,遇到问题了?那么使用正则吧,这样你就有两个问题了。正则表达式确实对字符串的处理有一个非常好的包装,正则用熟了之后相信你会很嫌弃使用原生字符处理函数的。但是,写正则表达式也是一个痛苦的过程,所以这就是第二个问题。
*本系列对正则表达式并不要求,所以本小节直接使用官方文档的截图,数据挖掘系列结束后如若有需要,讲解网络编程时再详细讲解正则表达式
![0?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/f31406ab44e7f91f690fe568d2c7f057.png)
![0?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/969a6a1523b6d4eda95bb820dcfccfae.png)
08
urllib模块
网络请求模块。
*大部分爬虫使用这个模块就足够了,这里也只会做个大体上的概述,详细讲解在之后的爬虫篇里。Python2和Python3的urllib模块差别有些大,3中的urllib将2中的urllib和urllib2两个模块合并了,并提供了一部分新的功能包装在urllib3中。
不过总体来说使用最多的是Request对象。这是创建一个网络请求的对象,提供下载文件和读取源码等等方法。
09
文件操作
其实就是读写文件,主要是针对文本文件。使用open函数。下面举例说明。
首先在G盘下新建一个文本文件
![0?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/77fcca16e3528d20246a337f01e16576.png)
![0?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/20f67b71c91bf88f496859ef508e6809.png)
open接受两个参数,第一个参数是文件的路径,第二个参数是读写权限的控制
r:可读。w:可写。a:追加。
特别说明一下可写和追加,w可写代表从头开始直接覆盖写入整个文件内容,a追加代表不更改文件内容,在文件末尾处进行追加写入内容。
以上这种方式使用open时一定要注意结尾处要有close,因为如果不关闭,在内存中这个文件就是一直打开状态的,当内容打开多了之后就会非常卡。
介绍另一种打开的方式,也是使用open函数。
![0?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/d54adebf4932376c59530ff5f24ab53e.png)
下面是写和追加的例子。
![0?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/485a31cfdb1c43d412ea12bdb42a2a1d.png)
![0?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/f624d2f1f5eaad093d3792a9bf18ca2e.png)
![0?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/7e825e90d176ad2ab14bdf9e367d0732.png)
![0?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/b89cfdd633ff53f6e3d27ea0f78549ba.png)
一般读写内容需要配合循环使用,在写入时,换行使用\n等转义字符。
小TIPS
10
绝对路径和相对路径。
在Windows下,绝对路径是指从盘符开始,一直到指定的文件夹或文件为止。例如上文中的G:/test.txt。使用 / 或 \ 都可以,但是需要注意的是 \ 是转义字符的意思,所以要使用它自己需要先转义自己一次。
相对路径是指从当前路径出发,例如下图中的例子,test文件在G盘根目录下。
![0?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/0ee128d921125770f7da25d8a21c8183.png)
现在在test文件夹下有t1、t2两个文件夹和test.txt。t1文件夹下有path_learn.py、t1.txt以及文件夹t11。我想在path_learn.py中读取t1.txt、t11.txt、test.txt、t2.txt四个文件。读取过程如下图代码。
![0?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/b6b4fba36e52e51d559b3e2ed75bf1ce.png)
./代表当前目录(Windows下可省略,但Linux下不能省略,故最好加上);
../代表上一层目录。
![0?wx_fmt=gif](https://i-blog.csdnimg.cn/blog_migrate/95b27299fbe185434cafad52ae510345.gif)
人生苦短,我选python。基础篇的最后一篇,先来个下马威2333,见识一下世界的宽广,功能还有非常非常多,了解有什么功能是学习程序的第一步,然后再来考虑如何实现。这些常用的内置模块全部玩熟,也至少得花上个把月的时间。本文也仅是列举了冰山一角,还没有讲解第三方模块的内容,这些都是python内置的功能。
![0?wx_fmt=gif](https://i-blog.csdnimg.cn/blog_migrate/95b27299fbe185434cafad52ae510345.gif)
重庆芝诺大数据分析有限公司是国内首批大数据技术应用解决方案的专业服务提供商,是中国商业联合会数据分析专业委员会事务所会员单位。公司基于Apache Hadoop 框架,自主研发的大数据综合分析处理平台—Zeno Data Matrix平台,提供一站式大数据开发环境和工具,包括数据抓取、清洗、储存、分布式计算、分析挖掘及可视化应用的整体解决方案。快速部署,整合数据信息,盘活数据资产,为政府、企业的经营决策提供科学支撑。
芝诺数据现拥有近20项自主知识产权的软件专利。拥有大数据综合分析处理平台(ZDM平台)、大数据教育(实训)平台、重庆市安全生产综合服务平台、四点半课堂等。