python 文件操作与函数式编程
2015-11-08 00:00
561 查看
内置函数
文件操作
操作文件时,一般需要经历如下步骤:打开文件
操作文件
一、打开文件
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。
打开文件的模式有:
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
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代码块执行完毕时,内部会自动关闭并释放文件资源。
在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
}
}
需求
read会读取所有内容到内存
xreadlines则只有在循环迭代时才获取
在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下
if条件语句下的内容可以被提取出来公用
对于上述的两种实现方式,第二次必然比第一次的重用性和可读性要好,其实这就是函数式编程和面向过程编程的区别:
函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
面向对象:对函数进行分类和封装,让开发“更快更好更强...”
函数的定义主要有如下要点:
def:表示函数的关键字
函数名:函数的名称,日后根据函数名调用函数
函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出[11,22,38,888,2]中的最大数等...
参数:为函数体提供数据
返回值:当函数执行完毕后,可以给调用者返回数据。
以上要点中,比较重要有参数和返回值:
1、返回值
函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。
发送短信的代码...
if发送成功:
returnTrue
else:
returnFalse
whileTrue:
#每次执行发送短信函数,都会将返回值自动赋值给result
#之后,可以根据result来写日志,或重发等操作
result=发送短信()
&n
3ff0
bsp;ifresult==False:
记录日志,短信发送失败...
2、参数
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接
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()
相关文章推荐
- python装饰器
- python之模块array
- python之函数用法setdefault()
- python之函数用法fromkeys()
- python之函数用法get()
- python之函数用法capitalize()
- python之函数用法isupper()
- python之函数用法islower()
- python之函数用法startswith()
- python之函数用法endswith()
- python之函数用法xrange()
- Python中的日志管理Logging模块
- Jenkins + python(requests)做接口自动化测试
- 数据挖掘 R VS Python
- python统计《悲惨世界》中出现次数最多的20个单词并绘制柱状图
- python socket模块学习
- python之函数用法globals()
- python之函数用法getattr()
- python 字符编码处理问题总结
- NumPy-快速处理数据--ndarray对象--数组的创建和存取