读写 CSV 编码数据
对于大部分类型的 CSV 数据,都可以使用 CSV 库处理。对于如下CSV文件:
zzz@ubuntu:~/my_learning$ cat file3
Name,Stu_num,Sge,Class
Tom,001,12,1
Jack,002,13,2
Dana,003,12,1
Emma,004,12,2
zzz@ubuntu:~/my_learning$
1. 使用 CSV 库读取文件
>>> with open('file3', 'rt') as f:
... f_csv = csv.reader(f)
... print(f_csv)
... headers = next(f_csv)
... for row in f_csv:
... print(row)
...
<_csv.reader object at 0x7f8577beadd0>
['Tom', '001', '12', '1']
['Jack', '002', '13', '2']
['Dana', '003', '12', '1']
['Emma', '004', '12', '2']
>>>
这样就可以将文件的每一行处理成一个元组,可以使用 row[1] 的形式访问。这样的索引含义不太清楚。因此,可以使用 namedtuple 命名元组。
>>> with open('file3', 'rt') as f:
... f_csv = csv.reader(f)
... headers = next(f_csv)
... Row = namedtuple('Row', headers)
... for r in f_csv:
... row = Row(*r)
... print(row)
...
Row(Name='Tom', Stu_num='001', Age='12', Class='1')
Row(Name='Jack', Stu_num='002', Age='13', Class='2')
Row(Name='Dana', Stu_num='003', Age='12', Class='1')
Row(Name='Emma', Stu_num='004', Age='12', Class='2')
>>>
使用 namedtuple 命名元组需要注意一个问题,就是列的标头需要是合法的 Python 标识符,这就需要在使用前对原始标头做必要的调整。另一种可行的方法是读取为字典序列。
>>> with open('file3', 'rt') as f:
... f_csv = csv.DictReader(f)
... for row in f_csv:
... print(row)
...
{'Name': 'Tom', 'Stu_num': '001', 'Age': '12', 'Class': '1'}
{'Name': 'Jack', 'Stu_num': '002', 'Age': '13', 'Class': '2'}
{'Name': 'Dana', 'Stu_num': '003', 'Age': '12', 'Class': '1'}
{'Name': 'Emma', 'Stu_num': '004', 'Age': '12', 'Class': '2'}
>>>
2. 使用 CSV 库写入文件
写入元组序列的数据:
>>> headers
['Name', 'Stu_num', 'Age', 'Class']
>>> rows
[('Nancy', '005', '13', '2'), ('Helen', '006', '12', '1')]
>>> with open('file3', 'w') as f:
... f_csv = csv.writer(f)
... f_csv.writerow(headers)
... f_csv.writerows(rows)
...
24
>>>
zzz@ubuntu:~/my_learning$ cat file3
Name,Stu_num,Age,Class
Nancy,005,13,2
Helen,006,12,1
zzz@ubuntu:~/my_learning$
或者写入字典序列的数据:
>>> R
[{'Name': 'Nancy', 'Stu_num': '005', 'Age': '13', 'Class': '2'}, {'Name': 'Helen', 'Stu_num': '006', 'Age': '12', 'Class': '1'}]
>>> with open('file3', 'w') as f:
... f_csv = csv.DictWriter(f, headers)
... f_csv.writeheader()
... f_csv.writerows(R)
...
24
>>>