本篇主要讲解Python对文件的处理,对文件的读写是我们日常中最用的操作了,不管你是分析日志还是要将生成的结果写到文件里,都需要用到读文件的读写操作,在python下对文件非常容易,我们使用它的内建函数open()就可以打开一个文件,如果你要打开个文件一般的用法是:
1 |
fi = open(filename, mode) |
这里fi是open()返回的文件对象,有的刚接触的小伙伴可能就要问了,啥叫文件对象呀,对象这是一个抽象的概念,在Python里一切都是对象,你可以理解为如果它是一个对象,那么它将有它的属性和方法, 不知道这么说清楚没有,没理解也没关系,多用就明白了, 另一个mode指明对文件的访问模式,常用模式如下:
r: 以读方式打开文件
w:以写方式打开文件
rb:以二进制读模式打开
wb:以二进制写模式打开
a:以追加模式打开
a+:以读写模式打开
这些模式基本覆盖了我们日常的对文件操作,当然除了这些还有一些其他模式,想深入了解的可以去自己学习下,如果是对运维来说这些基本够了。
首先我们来了解读文件的方法:
1、read()方法,这个方法不多介绍了,因为它有个硬伤就是它会一次将读入文件的所有内容,所以读大文件,会把你内存吃满。
2、readline()方法:这个函数在某些场景有估计会用到,它的作用就是每次从文件中读取一行出来,我们看个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
>>> fi = open('ins.yml') #如果以读模式打开,r可以省略 >>> while True: ... line = fi.readline() ... if not line: ... break ... else: ... print line ... - hosts: all tasks: - name: do script script: /root/inspection.sh - name: grant info fetch: dest=/root/report validate_md5=yes src=/root/info.txt - name: remove info.txt shell: rm -f /root/info.txt >>> fi.close() |
这个是每次读取一行,所以需要用到while 循环,用if来判断文件是否已经结束,如果结束就跳出,否则打印改行。
3、readlines()方法:这个方法我用的不多,因为它也有个硬伤就是它返回一个列表,所以当文件足够大的时候,返回的列表就会异常的大,就会非常慢,不过它的好处就是可以快速释放文件资源,我们了解下就可以,对付一般文件还是可以的,例子如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
>>> fi = open('ins.yml') >>> res = fi.readlines() >>> fi.close() >>> for line in res: ... print line ... --- - hosts: all tasks: - name: do script script: /root/inspection.sh - name: grant info fetch: dest=/root/report validate_md5=yes src=/root/info.txt - name: remove info.txt shell: rm -f /root/info.txt >>> type(res) <type 'list'> |
4、采用文件迭代的方式访问文件,这种方式应该是最常用的读取文件方式了,因为我们可以直接迭代文件对象,例子如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
>>> fi = open('ins.yml') >>> for line in fi: ... print line ... --- - hosts: all tasks: - name: do script script: /root/inspection.sh - name: grant info fetch: dest=/root/report validate_md5=yes src=/root/info.txt - name: remove info.txt shell: rm -f /root/info.txt >>> fi.close() |
以上就是读取文件的方法了,掌握了这几种基本就可以了,现在我们来看看如何将我们程序的结果写入到文件中, 写文件就用write()方法,不过有很多细节需要注意,我们先来看个简单的,就是我们把读出的文件写入到另一个文件里,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
>>> fi = open('ins.yml') >>> fo = open('new_ins.yml', 'a+') >>> for line in fi: ... fo.write(line) ... >>> fi.close() >>> fo.close() >>> fi = open('new_ins.yml') >>> for line in fi: ... print line ... --- - hosts: all tasks: - name: do script script: /root/inspection.sh - name: grant info fetch: dest=/root/report validate_md5=yes src=/root/info.txt - name: remove info.txt shell: rm -f /root/info.txt |
因为要生成一个新文件,所以需要打开一个新文件用来写入。
刚才为什么write()方法有些小细节呢,就是日常我们操作做,会出现往文件中写入中文的情况,如果你不进行编码,写入的中文是无法识别的,这时候就需要在写入前进行将字符串编码,例如将字符串编码为gb2312或utf-8,
1 2 |
s.encode('gb2312') s.encode('utf-8') |
当然如果是脚本,需要在脚本头部加上:
1 |
#coding=utf-8 |
这篇就到这里吧,本来想把CSV文件如何生成也一起写了,但发现篇幅有点长,就留到下篇吧,当然这篇算是基础中的基础了,关于读出的行如何进行处理,我并没有写任何逻辑去深入展开,因为涉及一些正则方面的知识,后续可以跟正则一起介绍。