Python--CSV模块
CSV
csv文件格式是一种通用的电子表格和数据库导入导出格式
简介
Python csv模块封装了常用的功能,使用的简单例子如下:
写入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 写入csv文件 import csv csvfile = open ( 'csv_test.csv' , 'w' ,newline = '') # 如果不指定newline='',有时则每写入一行将有一空行被写入 writer = csv.writer(csvfile) writer.writerow([ '姓名' , '年龄' , '电话' ]) # 写入一行用writerow data = [ ( 'al' , '25' , '1367890900' ), ( 'eg' , '18' , '1367890800' ) ] writer.writerows(data) # 多行用writerows csvfile.close() |
读取
1
2
3
4
5
6
7
8
|
# 读取csv文件 csv_reader = csv.reader( open ( 'csv_test.csv' , encoding = 'utf-8' )) for row in csv_reader: print (row) # ['姓名', '年龄', '电话'] # ['al', '25', '1367890900'] # ['eg', '18', '1367890800'] |
默认的情况下, 读和写使用逗号做分隔符(delimiter),用双引号作为引用符(quotechar),当遇到特殊情况是,可以根据需要手动指定字符, 例如:
1
2
3
4
5
6
7
8
9
10
|
import csv with open ( '/etc/passwd' , 'r' ) as f: reader = csv.reader(f, delimiter = ':' , quoting = csv.QUOTE_NONE) for row in reader: print (row) [ 'root' , 'x' , '0' , '0' , 'root' , '/root' , '/bin/bash' ] [ 'bin' , 'x' , '1' , '1' , 'bin' , '/bin' , '/sbin/nologin' ] [ 'daemon' , 'x' , '2' , '2' , 'daemon' , '/sbin' , '/sbin/nologin' ] …… |
上述示例指定冒号作为分隔符,并且指定quote方式为不引用。这意味着读的时候都认为内容是不被默认引用符(")包围的。
quoting的可选项为: QUOTE_ALL, QUOTE_MINIMAL, QUOTE_NONNUMERIC, QUOTE_NONE
.
有点需要注意的是,当用writer写数据时, None
会被写成空字符串,浮点类型会被调用 repr()
方法转化成字符串。所以非字符串类型的数据会被 str()
成字符串存储。
字典方式地读写
csv还提供了一种类似于字典方式的读写,方式如下:
格式如下:
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
29
30
31
|
headers = [ 'name' , 'age' ] datas = [{ 'name' : 'Bob' , 'age' : 23 }, { 'name' : 'Jerry' , 'age' : 44 }, { 'name' : 'Tom' , 'age' : 15 } ] with open ( 'example.csv' , 'w' , newline = '') as f: # 标头在这里传入,作为第一行数据 writer = csv.DictWriter(f, headers) writer.writeheader() for row in datas: writer.writerow(row) # 还可以写入多行 writer.writerows(datas) # 读 import csv with open ( 'example.csv' , 'r' ) as csvfile: reader = csv.DictReader(csvfile) for row in reader: print (row[ 'name' ], row[ 'age' ]) # name,age # Bob,23 # Jerry,44 # Tom,15 # Bob,23 # Jerry,44 # Tom,15 |
案例:使用csv格式展示磁盘空间
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
import re import csv import os from prettytable import from_csv import subprocess # 写入csv文件 import csv def cmd_exec(cmd): """ 执行shell命令 返回命令返回值和结果 :param cmd: :return: """ p = subprocess.Popen(cmd, shell = True , stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE) stdout, stderr = p.communicate() if p.returncode ! = 0 : return { 'code' :p.returncode, 'res' :to_str(stderr)} return { 'code' :p.returncode, 'res' :to_str(stdout)} def to_str(bytes_or_str): """ 把byte类型转换为str :param bytes_or_str: :return: """ if isinstance (bytes_or_str, bytes): value = bytes_or_str.decode( 'utf-8' ) else : value = bytes_or_str return value f = open ( 'disk.csv' , 'w+' , newline = ' ', encoding=' utf - 8 ' ) fieldnames = [ 'Dir' , 'Use%' , 'Avail' , 'Used' , 'Size' ] writer = csv.writer(f) writer.writerow(fieldnames) df_ret = cmd_exec( 'df -h| grep -E \([1-9]?[1-9]\%\)\|\(100\%\)' ) if df_ret[ 'code' ] = = 0 : if df_ret[ 'res' ]: for item in df_ret[ 'res' ].split( '\n' )[: - 1 ]: # 截取回车 d = re.split(r '\s+' , item) # 去除空格符 writer.writerow(d[ - 1 : - 6 : - 1 ]) f.flush() # 写入到磁盘 # os.fsync() 方法强制将文件描述符为fd的文件写入硬盘。在Unix, 将调用fsync()函数;在Windows, 调用 _commit()函数。 # 如果你准备操作一个Python文件对象f, 首先f.flush(),然后os.fsync(f.fileno()), # 确保与f相关的所有内存都写入了硬盘.在unix,Windows中有效。 os.fsync(f.fileno()) f.seek( 0 ) # 把文件指针置于开头 tb = from_csv(f) ### 设定左对齐 tb.align = 'l' ### 设定T_ID右对齐 tb.align[ "Use%" ] = "r" ### 设定数字输出格式 tb.float_format = "2.2" ### 设定边框连接符为'*" tb.junction_char = "*" # ### 设定排序列 # tb.sortby = "Use%" # ### 设定排序方式 # tb.reversesort = True ### 设定左侧不填充空白字符 tb.left_padding_width = 0 print (tb) # 打印表格 * - - - - - - - - - * - - - - - * - - - - - - * - - - - - * - - - - - * | Dir |Use % |Avail |Used |Size | * - - - - - - - - - * - - - - - * - - - - - - * - - - - - * - - - - - * | / | 11 % | 82G | 9.3G | 96G | | / dev / shm | 1 % | 931M | 72K | 931M | | / boot | 9 % | 421M | 39M | 485M | * - - - - - - - - - * - - - - - * - - - - - - * - - - - - * - - - - - * |