这篇我们接上一篇把文件操作接着写完,上篇我们介绍了文件的读写,在最后我们了解到了生成一个文件需要用到write()函数,现在我们介绍另一个写入文件的方式, 在shell下我们都知道有个echo命令, 它可以方便的将我们的文本写入或追加到一个文件中,在python下也有类似的方法,如果我们open了一个文件f,用以下语法就可以写入到这个文件中,类似echo命令:
>>> print >>f, 'some strings you want to write'
这个命令就可以把这个字符串追加到这个文件中,了解了这个方法,我们就可以在我们脚本中,将生成的结果直接重定向到我们的文本中,生成我们要的结果,但这种方法其实还有另一个用法,比如动态生成脚本,就是根据你输入的参数不同,生成的shell脚本也不同,这样可以很灵活的完成不同功能,比如要备份某些台机器的文件,你可以输入源和目的,自动生成一个shell脚本,然后调用去执行:
#!/usr/bin/python env
import os
import os.path
def create_shell(src,des):
if os.path.exists('./do.sh'):
os.remove('./do.sh')
with open('do.sh', 'a') as f:
print >>f, '#!/bin/bash'
print >>f, 'rsync -avzP {0} 1.1.1.1:{1}/ '.format(src,des )
if __name__ == '__main__':
create_shell('/data','/data')
这个脚本运行完会审生成一个do.sh的脚本文件,内容如下:
#!/bin/bash
rsync -avzP /data 1.1.1.1:/data/
这个脚本是动态生成的,根据你输入的参数不同,生成的脚本内容也不同。
这个内容就介绍到这里,接下来我看看如何读写CSV格式的文件,把结果转成CSV格式这个操作比较常见,下载下来用打开是表格形式,非常方便提供给其它部门或自己分析用,我们先看如何生存一个csv文件,假设你现在有一个数据文件内容如下:
cpu, mem, disk
8,16g,200
2,4g,200
4,8g,300
16,32g,600
这个可能是你采集的服务器硬件信息, 把这个文件转成csv格式我们需要用到Python的csv模块,上代码:
#!/usr/bin/env python
import csv
def csv_writer(data, filename):
with open(filename, "wb") as csv_file:
writer = csv.writer(csv_file, delimiter=',')
for line in data:
writer.writerow(line)
if __name__ == "__main__":
data = []
with open('data.txt') as f:
for line in f:
data.append(line.strip().split(","))
print data
filename = "output.csv"
csv_writer(data, filename)
脚本中我们定义了一个函数负责写入到csv文件, 在主函数中我们先定义了一个data空列表,然后打开我们的数据文件,把数据逗号分隔后加入到列表中,最后调用csv_writer()函数把内容写到文件中,这样就完成了,output.csv文件打开是这样的:
说完写,我们再说读,读一个CSV文件就比较容易了,我们还是用这个Output.csv文件,我们再把它读出来.
#/usr/bin/env python
import csv
def csv_reader(fi):
reader = csv.reader(open(fi))
for line in reader:
print line
if __name__ == "__main__":
csv_reader('output.csv')
结果如下:
['cpu', ' mem', ' disk']
['8', '16g', '200']
['2', '4g', '200']
['4', '8g', '300']
['16', '32g', '600']
看读出csv模块以列表的形式展示了我们的结果,根据这个结果其实就可以在脚本中加入自己的逻辑来处理这些数据。
关于CSV文件的操作还有一个比较常用的就是字典写,字典数据结构是非常重要的一种数据结构,所以如果在脚本中我们最终得到的数据是一个字典,那你没必要再转成其他数据结构,直接调用csv的字典写方法就可以写入到一个文件中,我给一个简单的例子:
#!/usr/bin/env python
import csv
d = {'a':1, 'b':2,'c':3,'d':4,'f':5}
f = open('dict2csv.csv', 'wt')
dict_writer = csv.DictWriter(f, fieldnames = d.keys())
dict_writer.writeheader()
dict_writer.writerow(d)
f.close()
在脚本中我直接定义了一个字典d,然后到打开一个csv文件, 调用csv.DictWriter()去写入,注意这个函数有2个参数,第一个文件文件对象,第二个是字典的Key, 然后写入头部就是把key写入,然后写入字典的数据,生成的文件结果是这样的: