分类目录归档:Python

python基础14-面向对象编程

从这篇起我们开始学习一些python面向对象的编程知识,面向对象编程是一种编程方式,这种编程方式是基于类和对象的使用,当然除了面向对象这种方式还有我们知道的面向过程编程方式,在这里不多展开说了,大家只要知道现在主流的编程语言都是面向对象语言就可以了,例如java,C++等,在Python设计之出就是一门面向对象语言,但它不强制你必须写OO的程序,但在java中,万物皆类,必须用OO的方式来编程, 我理解这可能也是Python入门容易的一个方面, 在我们之前写的程序都是用函数来实现的,我们没讲太多的概念, 但要学java, 必须先过OO这关,否则根本没法继续, 在正式开始介绍面向对象编程前我们先了解下面向对象的一些术语:

  • 类:对具有相同数据和方法的一组对象的描述或定义。
  • 对象:对象是一个类的实例。
  • 实例化:创建一个类的实例,类的具体对象
  • 实例属性(instance attribute):一个对象的数据或函数元素
  • 实例方法(instance method):所有存取或者更新对象某个实例一条或者多条属性的函数的集合。
  • 类属性(classattribute):属于一个类中所有对象的属性,仅与其被定义的类相绑定
  • 类方法(classmethod):那些无须特定的对性实例就能够工作的从属于类的函数。

除了基本术语,面向对象还有三大特性: 继承(Inheritance)、封装(Encapsulation)和多态(Polymorphism),概念太多就不全部展开说了,因为就单单面向对象的知识就够写本书了,有的小伙伴可能觉得面向对象的理论知识太多了,能不学吗?或者说面向对象编程重要吗? 在这我给一个肯定的答复:面向对象编程非常重要,如果你想要深入学习编程,面向对象是必须要了解的,因为现在一些开源的项目或者稍微大点的项目基本都是面向对象思路,如果你不懂,那些代码你根本没法看,就是硬着头皮看我估计也很难理清作者的编程思路,看到吐血直到自己放弃,在刚开始我们用不到,但当我们做一些项目时我们就要用到面向对象的方式去设计我们的代码实现了, 所以这也就是为什么面向对象编程在一些书里属于高级部分的原因,后续如果有时间我可以分享下我是如何阅读别人代码的。

上面讲的比较抽象,下面我通过一些大白话来理解下类和对象,那如何定义类,什么时候需要定义类呢?根据我们前面的概念,一个类就是具有相同属性和方法的对象定义或描述,例如我们人就是一个类,因为每个人都是人,但每个人又有不同,肤色,名字,性别等,这些就是人的属性,人还会走,跑,这些就是人的方法,所以如果一个事物有共性的部分,我们就可以抽象出来定义成一个类,另一个例子 比如我们现在经常看到的满大街的ofo 和摩拜自行车,从类的概念理解,每个自行车都有颜色,轮子等属性, 而自行车行走,停止就是自行车的方法,我用通过调用这些方法来控制自行车的行为,通过颜色、公司属性来定义一个具体的自行车,这就是类和对象,先定义类,然后类实例化一个对象,每个对象是具体的事物,他们有共同点又有不同点; 我们再来说一个项目中的例子,我们用到的数据库类, 里面的数据库名称,DBIP, 连接的用户名,密码都是属性, 而对数据库的查询,更新就是方法,例子就说这些, 大家应该都理解了, 这篇就写到这里吧,具体代码操作我们放下篇,我们看如何定义类、实例化和调用实例化方法。

 

 

 

python基础13-正则表达式

正则表达式是我们运维工作中比较常用,在工作中用的比较多的应该就是配合grep命令从某个文本中匹配出我们需要的内容,Python中集成了正则模块,可以直接调用正则调用来实现正则匹配,今天这篇我们就来介绍下Python的正则使用,因为正则表达式系统的展开说都够写一本书了,因为咱们主要介绍Python,  所以在这里我只介绍在python下的使用,不会系统的介绍什么是正则表达式和正则表达式的规则,不过本篇中的所有正则内容我都会解释,保证你看这篇文章无任何障碍。

python中集成正则模块re,所以我们使用就是Import re就可以了,import后就可以直接使用re模块的函数了,我们先来看第一个re.match的用法:

re.match函数从字符串的起始部分进行模式匹配,如果匹配成功就返回匹配对象,看个例子:

其中m是返回的匹配对象,group()是匹配对象的方法,返回整个匹配对象,刚才说了mach只能匹配字符串的开头,所以如果可以看一个匹配不成功的例子:

大家可以看到匹配不成功是,m就变成了None.

其实,我们大多数搜索特定字符串都在一个字符串的中间部门,这时候match就不行了,这时候就需要用到search()了,它的工作方式跟match一样,不同的是它可以搜索字符串的任意位置,匹配到就算成功,还用刚才的例子:

显示匹配成功,这里顺便介绍2个参数:

re.M:表示^和$分别匹配目标字符串的起始和结尾,而不是严格匹配整个字符串本身的起始和结束。

re.I表示不区分大小写

search()是搜索字符串中第一次出现的正则表达式的模式,所以让我们稍微修改下上面的例子:

明明有二个please,为什么只匹配了一个,这个没错,看我们刚说的功能介绍就明白了,那如果我想要都匹配呢,那就要用另一个函数findal()了,这个函数查找字符串中所有不是重复出现的正则模式,然后返回一个列表,看清楚,它是直接返回一个列表,还是刚才的例子:

除了字符串查询匹配,还有个一个分割函数也非常有用split,我们都知道字符串本身也带一个split方法,也能进行字符串分割,那它们有什么不同呢,其实如果不适用特殊的正则表达式进行模式匹配,它们的工作方式相同,但re.split适用于更复杂的的分割处理,我们来个例子看看re.split的厉害之处:

这么看它们基本是的功能是一样的,正则里\s表示空格,*表示0个或多个, 但我们遇到一个不完全规则的字符串,比如以不固定的字符或数字来分割,例如:line = ‘abc12def34ghi’, 要求这个以2个数字来分割,这个时候就要用到re.split了,看个例子:

正则里\d匹配任何十进制数字。

关于re的函数方法我们就介绍到这里,接下来我们说一下匹配对象的group和groups方法的区别,因为这2个会使人比较迷惑,我们来看个网上例子:

首先这例子里有2个问题需要去理解:

1.首先是match的问题.match是从开头匹配,为什么会匹配到c3呢?
2.group(0)是整个匹配项,为什么groups()中没有呢?

这里我说一下我的解释,match匹配从头匹配没错,但如果加上数字参数,它就可以显示特定子组的,第二个问题,没有的原因是groups()是列出从编号1开始的所有group,所以没有group(0), 因为这里只有一个分组,所以编号1就是c3,官方解释:

 

写在最后,grep命令是我们用来过滤某些字段信息的必备工具,我们就来实现一个简单的grep功能的脚本,代码如下:

这个脚本配合argparse模块,可以指定关键字和要搜索的文件内容,最后显示出匹配的行。

截止目前我们已经了解了Python大部分的功能,一路跟过来的小伙伴我想也应该能写些自己的脚本了,所以基本的内容就到这里了,下篇开始我们要讲解python的面向对象编程了,下篇见。

 

python基础12-系统操作

这篇我们介绍下跟操作系统相关的一些内容, 操作系统的技能算是我们运维人的基本功了,因为如果连敲命令都吃力的话也提谈不上什么自动化了, 在linux里我们经常用的命令比如, cp,  mv, mkdir, chown,chmod等基本一天下来也就这几个命令反复使用,其实只看这些体现不出来运维的能力,真正体现运维能力的地方是出现问题时如何分析解决,这是难点,这也跟经验有关, 在一个复杂的问题面前,这时候基本功就显得尤为重要,对操作系统理解的深度体现了解决问题的能力差别,如果你想在在操作系统层面理解的更深一点,我推荐你读一下《现代操作系统》这本书,读完这本书你在操作系统层面的认知会有一个比较大的提升,按照运维技术能力的发展,在理解操了操作系统的基础上这个时候我们一般开始接触学习shell编程了, 在这里我说一下做为一个Linux系统管理员,shell是你必须要掌握的技能,虽然Python都能实现,但我仍不建议你跳过shell这个重要阶段,因为如果你做运维,你不可能避免接触shell,就算你不写,你也避免不了去看别人写的shell,还有就是公司不可能就你一个运维,你不用不代表别人不用,你想想如果大家在一个团队里工作,如果都互相看不懂别人的脚本,大家还怎么配合工作?

搞定上面shell阶段后,出于对自己更高的要求(其实想多挣点钱),了解到了现在公司招聘都需要Python,就开始看书发奋学习,在看过书后,开始上手写一些功能脚本,很快就会发现用python很麻烦,不如用shell直接操作方便,不过这也难不倒我们,一顿搜索之后发现了一个宝贝,os.system(), 这个函数可以直接调用shell命令来执行,从那一刻起就像手中有了亚瑟大宝剑,所有需要shell执行的部分全部用这个函数来完成, 等写完某个脚本后感觉非常有成就感,而且感觉自己python水平与日俱增,自我感觉非常良好,但你实际去看写的每个脚本,你发现不到100行的Python代码里有,有一半以上的行都是os.system()调用的shell命令, 好好的shell命令硬生生的在外面包了一层python代码,每当我看到这些代码,我都无语,如果你也在写这种脚本,我建议你尽快停掉这种方式吧,因为你即使写一万行这种代码,对你学习python基本没有质的提升,何必呢,看着都累。

写在最后,因为关于操作系统方面的内容比较基础,我也没准备什么例子去展示,不过为了大家进一步的了解,我列了下一些系统方面的操作供大家参考学习:

判断目录存在和是否文件:

部分常用系统命令:

文件匹配,glob模块使用:

在操作系统层面还有对日期时间的处理可以看我之前的文章。

当然有时避免不了要调用shell命令,但我建议用这种方式,os.system()方式以后就取消了。

 

python基础11-文件读写part2

这篇我们接上一篇把文件操作接着写完,上篇我们介绍了文件的读写,在最后我们了解到了生成一个文件需要用到write()函数,现在我们介绍另一个写入文件的方式, 在shell下我们都知道有个echo命令, 它可以方便的将我们的文本写入或追加到一个文件中,在python下也有类似的方法,如果我们open了一个文件f,用以下语法就可以写入到这个文件中,类似echo命令:

这个命令就可以把这个字符串追加到这个文件中,了解了这个方法,我们就可以在我们脚本中,将生成的结果直接重定向到我们的文本中,生成我们要的结果,但这种方法其实还有另一个用法,比如动态生成脚本,就是根据你输入的参数不同,生成的shell脚本也不同,这样可以很灵活的完成不同功能,比如要备份某些台机器的文件,你可以输入源和目的,自动生成一个shell脚本,然后调用去执行:

这个脚本运行完会审生成一个do.sh的脚本文件,内容如下:

这个脚本是动态生成的,根据你输入的参数不同,生成的脚本内容也不同。

这个内容就介绍到这里,接下来我看看如何读写CSV格式的文件,把结果转成CSV格式这个操作比较常见,下载下来用打开是表格形式,非常方便提供给其它部门或自己分析用,我们先看如何生存一个csv文件,假设你现在有一个数据文件内容如下:

这个可能是你采集的服务器硬件信息, 把这个文件转成csv格式我们需要用到Python的csv模块,上代码:

脚本中我们定义了一个函数负责写入到csv文件, 在主函数中我们先定义了一个data空列表,然后打开我们的数据文件,把数据逗号分隔后加入到列表中,最后调用csv_writer()函数把内容写到文件中,这样就完成了,output.csv文件打开是这样的:

csvcsv

说完写,我们再说读,读一个CSV文件就比较容易了,我们还是用这个Output.csv文件,我们再把它读出来。

结果如下:

看读出csv模块以列表的形式展示了我们的结果,根据这个结果其实就可以在脚本中加入自己的逻辑来处理这些数据。

关于CSV文件的操作还有一个比较常用的就是字典写,字典数据结构是非常重要的一种数据结构,所以如果在脚本中我们最终得到的数据是一个字典,那你没必要再转成其他数据结构,直接调用csv的字典写方法就可以写入到一个文件中,我给一个简单的例子:

在脚本中我直接定义了一个字典d,然后到打开一个csv文件, 调用csv.DictWriter()去写入,注意这个函数有2个参数,第一个文件文件对象,第二个是字典的Key, 然后写入头部就是把key写入,然后写入字典的数据,生成的文件结果是这样的:

csv_dict

这篇就到这里,喜欢的小伙伴欢迎转发,谢谢

 

 

 

python基础10-文件读写part1

本篇主要讲解Python对文件的处理,对文件的读写是我们日常中最用的操作了,不管你是分析日志还是要将生成的结果写到文件里,都需要用到读文件的读写操作,在python下对文件非常容易,我们使用它的内建函数open()就可以打开一个文件,如果你要打开个文件一般的用法是:

这里fi是open()返回的文件对象,有的刚接触的小伙伴可能就要问了,啥叫文件对象呀,对象这是一个抽象的概念,在Python里一切都是对象,你可以理解为如果它是一个对象,那么它将有它的属性和方法, 不知道这么说清楚没有,没理解也没关系,多用就明白了, 另一个mode指明对文件的访问模式,常用模式如下:

r: 以读方式打开文件

w:以写方式打开文件

rb:以二进制读模式打开

wb:以二进制写模式打开

a:以追加模式打开

a+:以读写模式打开

这些模式基本覆盖了我们日常的对文件操作,当然除了这些还有一些其他模式,想深入了解的可以去自己学习下,如果是对运维来说这些基本够了。

首先我们来了解读文件的方法:

1、read()方法,这个方法不多介绍了,因为它有个硬伤就是它会一次将读入文件的所有内容,所以读大文件,会把你内存吃满。

2、readline()方法:这个函数在某些场景有估计会用到,它的作用就是每次从文件中读取一行出来,我们看个例子:

这个是每次读取一行,所以需要用到while 循环,用if来判断文件是否已经结束,如果结束就跳出,否则打印改行。

3、readlines()方法:这个方法我用的不多,因为它也有个硬伤就是它返回一个列表,所以当文件足够大的时候,返回的列表就会异常的大,就会非常慢,不过它的好处就是可以快速释放文件资源,我们了解下就可以,对付一般文件还是可以的,例子如下:

4、采用文件迭代的方式访问文件,这种方式应该是最常用的读取文件方式了,因为我们可以直接迭代文件对象,例子如下:

 

以上就是读取文件的方法了,掌握了这几种基本就可以了,现在我们来看看如何将我们程序的结果写入到文件中, 写文件就用write()方法,不过有很多细节需要注意,我们先来看个简单的,就是我们把读出的文件写入到另一个文件里,如下:

因为要生成一个新文件,所以需要打开一个新文件用来写入。

刚才为什么write()方法有些小细节呢,就是日常我们操作做,会出现往文件中写入中文的情况,如果你不进行编码,写入的中文是无法识别的,这时候就需要在写入前进行将字符串编码,例如将字符串编码为gb2312或utf-8,

 

当然如果是脚本,需要在脚本头部加上:

这篇就到这里吧,本来想把CSV文件如何生成也一起写了,但发现篇幅有点长,就留到下篇吧,当然这篇算是基础中的基础了,关于读出的行如何进行处理,我并没有写任何逻辑去深入展开,因为涉及一些正则方面的知识,后续可以跟正则一起介绍。