我们经常会用 CSV 文件保存联系人信息,或者一些表格数据, 在 Python 中也会有支持 CSV 的标准库。
如果需要从 CSV 文件中读取数据并返回一组字典应该怎么做呢?
比如对下面这个文件 data.csv
"Ordinal","Name","DoB"
1,"Annabel",08/18/2007
2,"Brian",08/19/2007
3,"Charlie",08/20/2007
4,"Derek",08/21/2007
5,"Emily",08/22/2007
6,"Fortune",08/23/2007
7,"Gerald",08/24/2007
8,"Harriet",08/25/2007
9,"India",08/26/2007
可以用下面这个函数来读取数据, 把第一行的列名作为字典的 key ,后面每行的数据做为 value, 和 key 对应地逐条显示出来。
import csv
def read_csv_loop(file_name='data.csv'):
raw_result = []
with open(file_name) as f:
reader = csv.reader(f)
for row in reader:
raw_result.append(row)
keys = raw_result[0]
result = []
for row in raw_result[1:]:
result.append({keys[i] : val for i, val in enumerate(row)})
return result
其中 with 语句是为了防止打开的文件忘记被关掉,不过这个方法有点麻烦,它用了一个 enumerate 函数来遍历读出来的结果。csv 还有更好用的方法 DictReader 可以利用,
import csv
def read_csv(file_name='data.csv'):
with open(file_name) as f:
reader = csv.DictReader(f)
return [row for row in reader]
if __name__ == '__main__':
print read_csv('data.csv')
输出:
[{'Ordinal': '1', 'DoB': '08/18/2007', 'Name': 'Annabel'}, {'Ordinal': '2', 'DoB': '08/19/2007', 'Name': 'Brian'}, {'Ordinal': '3', 'DoB': '08/20/2007', 'Name': 'Charlie'}, {'Ordinal': '4', 'DoB': '08/21/2007', 'Name': 'Derek'}, {'Ordinal': '5', 'DoB': '08/22/2007', 'Name': 'Emily'}, {'Ordinal': '6', 'DoB': '08/23/2007', 'Name': 'Fortune'}, {'Ordinal': '7', 'DoB': '08/24/2007', 'Name': 'Gerald'}, {'Ordinal': '8', 'DoB': '08/25/2007', 'Name': 'Harriet'}, {'Ordinal': '9', 'DoB': '08/26/2007', 'Name': 'India'}]