pythonwrite写多⾏_⽤Python来解析⽂本
本篇主要介绍⼀下如何读写plain text⽂件,简单理解就是纯⽂本⽂件,经过字符编码形成的⽂档,⽤⼀些⽂本编辑器如UE、记事本可以打
开的⽂件。区别于⼀些有特定结构的⽂件,⽐如word⽂档、Excel⽂件、图⽚⽂件等等,他们必须借助专门的软件才能打开,没有任何可读
性的⼆进制编码⽂件。
⼤家⽇常其实⾮常多的时间是与⽂本打交道的,⽐如设备配置、各类⽇志。⼀般是⽤⼀些ue全局搜索,有时候这些⼯作特别枯燥、重复,我
们今天就来讲讲如何⽤python来处理⽂本⽂件,结合函数和字符串的⼀些操作。可以普适到系统运维⼯作,或者其他⼯作领域。
免责声明:针对初学者,本⽂很多内容都以简单直接可能不太正确的⽅式表达,各位如果在后续的学习中会发现其中的问题,请不要喷我。
初学者,最重要的是能够获取想要的结果,有继续学习的动⼒。
函数
开始之前先介绍⼀下python的函数定义,补充点知识,我们在写程序的时候可以把⼀些重复使⽤的代码抽象到⼀个函数中去,想想我们学
数学的函数f(x,y)= |x-y|,计算两个数的差值,f其实就是function的缩写,当然我们也可以把这个函数命名为func,它只是⼀个代号,但是
在⼀个⽂件中不要重复。我们在使⽤函数的时候,按函数的定义放⼊参数,⽐如令x=1,y=2 ,这个时候1,2是传⼊的实际值,⽽x,y是参数
名字。
python的函数其实也类似,只不过,这个数学的函数⽐较简单是⼀⾏数学公式,我们实际的函数可能是⾮常多⾏的代码。
python中函数的定义,参数的定义
在Python中,定义⼀个函数要使⽤def语句,依次写出函数名、括号、括号中的参数和“冒号:“,然后,在缩进块中编写函数体,函数的
返回值⽤return语句返回。
def ssh_dev_exc(dev_ip, port,command,username='user',password='password'): print('正在登录{}设备'.format(dev_ip)) # do something ,ssh device output
如上,有默认值的函数放到后⾯,⽆默认值的函数放到前⾯。函数内的逻辑块最后返回计算结果。其实可以不return,相当于returnpython怎么读的
None。这个时候看你如何设计函数了,其实我们建议,把结果返回,⽐如我们处理⽂本,就返回结果,最好是格式化数据。上⾯例⼦返回
的是⼀个tuple。
dev_ip, port,username,password是此函数的参数,其中username='admin',password='admin123' 定义了默认参数,后续调⽤时可以
不写这两个参数,函数会⾃动补上。默认参数⼀定要在⼀堆参数的最后。参数可以为空,即函数可以没有参数。
return 可以不写,默认是返回None;可以返回多个参数,本质是返回了⼀个tuple
调⽤函数
像数学公式⼀样,函数名后⾯跟括号,传⼊参数的实际值。
前提是他们在⼀个python⽂件中,如果调⽤其他的,需要通过import 引⼊,import引⼊⽅式多种多样,⼀会会简单演⽰。
ssh_dev_exc('127.0.0.1',22,'show version')
这个例⼦会依次赋值dev_ip、port、command三个参数,后⾯的会⽤默认值。
我们也可以这样使⽤
ssh_dev_exc(dev_ip='127.0.0.1',port=22,commnad='show version')
指向性更明确,初学者可以多写点,⽤这种⽅式,后续熟练后可以上⾯的⽅式。
还可以这样
ssh_dev_exc('127.0.0.1',22,'show version',usernmae='root')
try: f = open('/path/to/file', 'r',encoding='utf8')
ad())finally: if f: f.close()
但是每次都这么写实在太繁琐,所以,Python引⼊了with语句来⾃动帮我们调⽤close()⽅法:
with open('/path/to/file', 'r',encoding='utf8') as f
ad())
这和前⾯的try ... finally是⼀样的,但是代码更佳简洁,并且不必调⽤f.close()⽅法。
调⽤read()会⼀次性读取⽂件的全部内容,如果⽂件有10G,内存就爆了,所以,要保险起见,可以反复调⽤read(size)⽅法,每次最多读取size个字节的内容。另外,调⽤readline()可以每次读取⼀⾏内容,调⽤readlines()⼀次读取所有内容并按⾏返回list。因此,要根据需要决定怎么调⽤。
读取⼤⽂件
⽐较pythonic的⽅法是:
with open(filename, 'r',encoding='utf8') as flie: for line in file: print(line)
以上代码会逐⾏去读取⽂本内容,不会出现内存泄露的情况。
或者使⽤以下代码也可以,readline会逐⾏读取,不会⼀次加载。
while True: line = f.readline() if not line: break
以下⽅法针对⼩⽂件的时候可以,但是⽂件⽐较⼤的时候会有内存泄露的风险,因为readlines是⼀次读取所有的⾏,放到⼀个list中返回。for line adlines(): print(line.strip()) # 把末尾的'\n'删掉
写⼊⽂件
写⽂件和读⽂件是⼀样的,唯⼀区别是调⽤open()函数时,传⼊标识符'w'或者'wb'表⽰写⽂本⽂件或写⼆进制⽂件:
>>> f = open('/Users/', 'w',encoding='utf8')>>> f.write('Hello, world!')>>> f.close()
你可以反复调⽤write()来写⼊⽂件,但是务必要调⽤f.close()来关闭⽂件。当我们写⽂件时,操作系统往往不会⽴刻把数据写⼊磁盘,⽽是放到内存缓存起来,空闲的时候再慢慢写⼊。只有调⽤close()⽅法时,操作系统才保证把没有写⼊的数据全部写⼊磁盘。忘记调⽤close()的后果是数据可能只写了⼀部分到磁盘,剩下的丢失了。所以,还是⽤with语句来得保险:
with open('/Users/', 'w',encoding='utf8') as f: f.write('Hello, world!')
要写⼊特定编码的⽂本⽂件,请给open()函数传⼊encoding参数,将字符串⾃动转换成指定编码。
file-like Object
像open()函数返回的这种有个read()⽅法的对象,在Python中统称为file-like Object。除了file外,还可以是内存的字节流,⽹络流,⾃定义流等等。file-like Object不要求从特定类继承,只要写个read()⽅法就⾏。
我们逐⾏读取后,解析端⼝的⼀些信息。
如我们⼀般是从⽂本读取配置,解析出来后写⼊表格,下⼀节我们讲讲如何把这个列表写⼊Excel表格中去。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论