1.写入csv例程
import csv
header = ['name','age','id','phone']
data = [['armwid1',11,110,123456],
['armwid2',12,111,123456],
['armwid3',13,112,123456],
['armwid4',14,113,123456],
['armwid5',15,114,123456]]
def main():
print('type:%s,data[0]:%s' %(type(data[0]),data[0]))
with open("test.csv", 'wb') as f:
csvwriter = csv.writer(f)
csvwriter.writerow(header)
for raw in data :
csvwriter.writerow(raw)
if __name__ == '__main__':
main()
运行结果:
D:\test\python>python csv_test.py
type:<type 'list'>,data[0]:['armwid1', 11, 110, 123456]
- 上面例程特意打出了二维list的元素,仍然是list对象。
- 使用with打开文件时,开发者就无需关心文件的关闭操作,一切由系统管理。
下面是上面脚本运行后的脚本,可以发现和预期一致。
2.调试遇到的坑
一开始在写例子测试时测试都没有问题,后来不知道怎么了,一直报下面的错误。
D:\test\python>python csv_test.py
['armwid1', 11, 110, 123456]
Traceback (most recent call last):
File "csv_test.py", line 21, in <module>
main()
File "csv_test.py", line 15, in main
csvwriter = csv.writer(f)
AttributeError: 'module' object has no attribute 'writer'
从上面的错误可以发现是csv模块中没有实现writer方法,这怎么可能呢。一开始还是好好的,经过近一个小时排查,突然发现有一个脚本被命名为csv.py
,oh my god!真的很蛋疼,把名字改成不是系统模块的名字就可以了。
由此要特别注意 脚本名字不要定义成和系统模块一样的名字。
3.扩展例程(cameraservice内存)
最近需要把Camera内存使用的详细数据统计出来,找到峰值内存。目前正直新型冠状高发期,找到2015年的小米Note(Android M)实验了一把,脚本中有把数据导入到csv文件中。Android M的系统cameraservice还在mediaserver中,所以脚本中直接就统计mediaserver的内存数据,这里就做演示了。
操作手法:打开小米相机,拍照5次,统计cameraservice的内存使用量。
import re
import subprocess
import sys
import time
import csv
#APP_NAME = "com.android.camera"
APP_NAME = "mediaserver"
dict = {'Java Heap': 0,
'Native Heap': 0,
'Code': 0,
'Stack': 0,
'Graphics': 0,
'Private Other': 0,
'System': 0,
'TOTAL': 0,
'TOTAL SWAP \(KB\)': 0
}
# get process ID
def get_process_pid(str) :
cmd2 = ('adb shell ps')
process2 = subprocess.Popen(cmd2.split(), stdout=subprocess.PIPE)
cmd_ret2 = process2.stdout.read()
cmd_list = []
cmd_list = cmd_ret2.split('\n');
for cam in cmd_list :
if (str in cam) :
cam = cam.split()
return cam[1]
def main():
pid = get_process_pid(APP_NAME)
print("pid:%s" %pid)
with open("default1.csv", 'wb') as csvfile:
csvwriter = csv.writer(csvfile)
header = dict.keys()
csvwriter.writerow(header)
#print type(csvwriter)
while (1) :
cmd_dump = ('adb shell dumpsys meminfo %s' % pid)
process2 = subprocess.Popen(cmd_dump.split(), stdout=subprocess.PIPE)
cmd_result = process2.stdout.read()
for key in dict.keys():
pattern = ('%s: +([0-9]*)' % key)
match = re.search(pattern.__str__(), cmd_result)
if match is not None :
dict[key] = match.group(1)
print(dict.values())
csvwriter.writerow(dict.values())
# time.sleep(DISPLAY_CMD_WAIT)
if __name__ == '__main__':
main()
运行后生成的csv文件如预期,实际数据如下:
如下是统计cameraservice使用的内存图形,可以发现有5次内存使用量的高峰,如预期操作那样。明天尝试用python画图。