您的位置:首页 > 编程语言 > Python开发

python 文件操作与函数式编程

2015-11-08 00:00 561 查看

内置函数



文件操作

操作文件时,一般需要经历如下步骤:

打开文件

操作文件

一、打开文件

文件句柄=file('文件路径','模式')

注:python中打开文件有两种方式,即:open(...)和file(...),本质上前者在内部会调用后者来进行文件操作,推荐使用open

打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。
打开文件的模式有:

r,只读模式(默认)。

w,只写模式。【不可读;不存在则创建;存在则删除内容;】

a,追加模式。【可读;不存在则创建;存在则只追加内容;】

"+"表示可以同时读写某个文件

r+,可读写文件。【可读;可写;可追加】

w+,无意义

a+,同a

"U"表示在读取时,可以将\r\n\r\n自动转换成\n(与r或r+模式同使用)

rU

r+U

"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

rb

wb

ab

classfile(object):

defclose(self):#realsignatureunknown;restoredfrom__doc__
关闭文件
"""
close()->Noneor(perhaps)aninteger.Closethefile.

Setsdataattribute.closedtoTrue.Aclosedfilecannotbeusedfor
furtherI/Ooperations.close()maybecalledmorethanoncewithout
error.Somekindsoffileobjects(forexample,openedbypopen())
mayreturnanexitstatusuponclosing.
"""

deffileno(self):#realsignatureunknown;restoredfrom__doc__
文件描述符
"""
fileno()->integer"filedescriptor".

Thisisneededforlower-levelfileinterfaces,suchos.read().
"""
return0

defflush(self):#realsignatureunknown;restoredfrom__doc__
刷新文件内部缓冲区
"""flush()->None.FlushtheinternalI/Obuffer."""
pass

defisatty(self):#realsignatureunknown;restoredfrom__doc__
判断文件是否是同意tty设备
"""isatty()->trueorfalse.Trueifthefileisconnectedtoattydevice."""
returnFalse

defnext(self):#realsignatureunknown;restoredfrom__doc__
获取下一行数据,不存在,则报错
"""x.next()->thenextvalue,orraiseStopIteration"""
pass

defread(self,size=None):#realsignatureunknown;restoredfrom__doc__
读取指定字节数据
"""
read([size])->readatmostsizebytes,returnedasastring.

Ifthesizeargumentisnegativeoromitted,readuntilEOFisreached.
Noticethatwheninnon-blockingmode,lessdatathanwhatwasrequested
maybereturned,evenifnosizeparameterwasgiven.
"""
pass

defreadinto(self):#realsignatureunknown;restoredfrom__doc__
读取到缓冲区,不要用,将被遗弃
"""readinto()->Undocumented.Don'tusethis;itmaygoaway."""
pass

defreadline(self,size=None):#realsignatureunknown;restoredfrom__doc__
仅读取一行数据
"""
readline([size])->nextlinefromthefile,asastring.

Retainnewline.Anon-negativesizeargumentlimitsthemaximum
numberofbytestoreturn(anincompletelinemaybereturnedthen).
ReturnanemptystringatEOF.
"""
pass

defreadlines(self,size=None):#realsignatureunknown;restoredfrom__doc__
读取所有数据,并根据换行保存值列表
"""
readlines([size])->listofstrings,eachalinefromthefile.

Callreadline()repeatedlyandreturnalistofthelinessoread.
Theoptionalsizeargument,ifgiven,isanapproximateboundonthe
totalnumberofbytesinthelinesreturned.
"""
return[]

defseek(self,offset,whence=None):#realsignatureunknown;restoredfrom__doc__
指定文件中指针位置
"""
seek(offset[,whence])->None.Movetonewfileposition.

Argumentoffsetisabytecount.Optionalargumentwhencedefaultsto
0(offsetfromstartoffile,offsetshouldbe>=0);othervaluesare1
(moverelativetocurrentposition,positiveornegative),and2(move
relativetoendoffile,usuallynegative,althoughmanyplatformsallow
seekingbeyondtheendofafile).Ifthefileisopenedintextmode,
onlyoffsetsreturnedbytell()arelegal.Useofotheroffsetscauses
undefinedbehavior.
Notethatnotallfileobjectsareseekable.
"""
pass

deftell(self):#realsignatureunknown;restoredfrom__doc__
获取当前指针位置
"""tell()->currentfileposition,aninteger(maybealonginteger)."""
pass

deftruncate(self,size=None):#realsignatureunknown;restoredfrom__doc__
截断数据,仅保留指定之前数据
"""
truncate([size])->None.Truncatethefiletoatmostsizebytes.

Sizedefaultstothecurrentfileposition,asreturnedbytell().
"""
pass

defwrite(self,p_str):#realsignatureunknown;restoredfrom__doc__
写内容
"""
write(str)->None.Writestringstrtofile.

Notethatduetobuffering,flush()orclose()maybeneededbefore
thefileondiskreflectsthedatawritten.
"""
pass

defwritelines(self,sequence_of_strings):#realsignatureunknown;restoredfrom__doc__
将一个字符串列表写入文件
"""
writelines(sequence_of_strings)->None.Writethestringstothefile.

Notethatnewlinesarenotadded.Thesequencecanbeanyiterableobject
producingstrings.Thisisequivalenttocallingwrite()foreachstring.
"""
pass

defxreadlines(self):#realsignatureunknown;restoredfrom__doc__
可用于逐行读取文件,非全部
"""
xreadlines()->returnsself.

Forbackwardcompatibility.Fileobjectsnowincludetheperformance
optimizationspreviouslyimplementedinthexreadlinesmodule.
"""
pass
三、with

为了避免打开文件后忘记关闭,可以通过管理上下文,即:

withopen('log','r')asf:

...
如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
在Python2.7后,with又支持同时对多个文件的上下文进行管理,即:
withopen('log1')asobj1,open('log2')asobj2:
pass
四、那么问题来了...
1、如何在线上环境优雅的修改配置文件?
global
log127.0.0.1local2
daemon
maxconn256
log127.0.0.1local2info
defaults
logglobal
modehttp
timeoutconnect5000ms
timeoutclient50000ms
timeoutserver50000ms
optiondontlognull

listenstats:8888
statsenable
statsuri/admin
statsauthadmin:1234

frontendeddy.org
bind0.0.0.0:80
optionhttplog
optionhttpclose
optionforwardfor
logglobal
aclwwwhdr_reg(host)-iwww.oschina.org
use_backendwww.oschina.orgifwww

backendwww.oschina.org
server1.1.1.1weight20maxconn3000

原配置文件
1、查
输入:www.oschina.org
获取当前backend下的所有记录

2、新建
输入:
arg={
'bakend':'www.oschina.org',
'record':{
'server':'2.2.2.2',
'weight':20,
'maxconn':30
}
}

3、删除
输入:
arg={
'bakend':'www.oschina.org',
'record':{
'server':'2.2.2.2',
'weight':20,
'maxconn':30
}
}

需求
2、文件处理中xreadlines的内部是如何实现的呢?

read会读取所有内容到内存

xreadlines则只有在循环迭代时才获取

defNReadlines(): withopen('log','r')asf: whileTrue: line=f.next() ifline: yieldline else: return foriinNReadlines(): printi 基于next自定义生成器NReadlines defNReadlines(): withopen('log','r')asf: seek=0 whileTrue: f.seek(seek) data=f.readline() ifdata: seek=f.tell() yielddata else: return foriteminNReadlines(): printitem 基于seek和tell自定义生成器NReadlines

在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下

while
True



if
cpu利用率>
90
%
:


#发送邮件提醒


连接邮箱服务器


发送邮件


关闭连接




if
硬盘使用空间>
90
%
:


#发送邮件提醒


连接邮箱服务器


发送邮件


关闭连接




if
内存占用>
80
%
:


#发送邮件提醒


连接邮箱服务器


发送邮件


关闭连接

if条件语句下的内容可以被提取出来公用

def
发送邮件(内容)


#发送邮件提醒


连接邮箱服务器


发送邮件


关闭连接



while
True





if
cpu利用率>
90
%
:


发送邮件(
'CPU报警'
)




if
硬盘使用空间>
90
%
:


发送邮件(
'硬盘报警'
)




if
内存占用>
80
%
:

对于上述的两种实现方式,第二次必然比第一次的重用性和可读性要好,其实这就是函数式编程和面向过程编程的区别:

函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可

面向对象:对函数进行分类和封装,让开发“更快更好更强...”

函数的定义主要有如下要点:

def:表示函数的关键字

函数名:函数的名称,日后根据函数名调用函数

函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出[11,22,38,888,2]中的最大数等...

参数:为函数体提供数据

返回值:当函数执行完毕后,可以给调用者返回数据。

以上要点中,比较重要有参数和返回值:
1、返回值
函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。
def发送短信():

发送短信的代码...

if发送成功:
returnTrue
else:
returnFalse

whileTrue:

#每次执行发送短信函数,都会将返回值自动赋值给result
#之后,可以根据result来写日志,或重发等操作

result=发送短信()
&n
3ff0
bsp;ifresult==False:
记录日志,短信发送失败...
2、参数

defCPU报警邮件()
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接

def硬盘报警邮件()
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接

def内存报警邮件()
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接

whileTrue:

ifcpu利用率>90%:
CPU报警邮件()

if硬盘使用空间>90%:
硬盘报警邮件()

if内存占用>80%:
内存报警邮件()

上例,无参数实现
def发送邮件(邮件内容)

#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接

whileTrue:

ifcpu利用率>90%:
发送邮件("CPU报警了。")

if硬盘使用空间>90%:
发送邮件("硬盘报警了。")

if内存占用>80%:
发送邮件("内存报警了。")

上列,有参数实现

函数的有三中不同的参数:

普通参数

默认参数

动态参数

##########定义函数#########

#name叫做函数func的形式参数,简称:形参
deffunc(name):
printname

##########执行函数#########
#'eddy'叫做函数func的实际参数,简称:实参
func('eddy')

普通参数

deffunc(name,age=18):

print"%s:%s"%(name,age)

#指定参数
func('eddy',19)
#使用默认参数
func('eddy')

注:默认参数需要放在参数列表最后

默认参数

deffunc(*args):

printargs

#执行方式一
func(11,33,4,4454,5)

#执行方式二
li=[11,2,2,3,3,4,54]
func(*li)

动态参数一

deffunc(**kwargs):

printargs

#执行方式一
func(name='eddy',age=18)

#执行方式二
li={'name':'eddy',age:18,'gender':'male'}
func(**li)

动态参数二

deffunc(*args,**kwargs):
printargs
printkwargs

扩展
importsmtplib
fromemail.mime.textimportMIMEText
fromemail.utilsimportformataddr

msg=MIMEText('邮件内容','plain','utf-8')
msg['From']=formataddr(["eddy",'eddy@126.com'])
msg['To']=formataddr(["yys",'yys@qq.com'])
msg['Subject']="主题"

server=smtplib.SMTP("smtp.126.com",25)
server.login("eddy@126.com","邮箱密码")
server.sendmail('eddy@126.com',['yys@qq.com',],msg.as_string())
server.quit()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: