我们经常会用 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'}]