从CSV文件创build字典

我正在尝试编写一个Python脚本,它将从CSV文件中获取input,然后将其推送到字典格式(我正在使用Python 3.x)。

我使用下面的代码来读取CSV文件,并工作:

import csv reader = csv.reader(open('C:\\Users\\Chris\\Desktop\\test.csv'), delimiter=',', quotechar='|') for row in reader: print(', '.join(row)) 

但现在我想把结果放到一个字典中。 我想将CSV文件的第一行用作字典的“键”字段,CSV文件中的后续行将填充数据部分。

示例数据:

  Date First Name Last Name Score 12/28/2012 15:15 John Smith 20 12/29/2012 15:15 Alex Jones 38 12/30/2012 15:15 Michael Carpenter 25 

还有其他的东西我想用这个代码做,但现在只是让字典工作是我正在寻找。

谁能帮我这个?

EDITED版本2:

 import csv reader = csv.DictReader(open('C:\\Users\\Chris\\Desktop\\test.csv')) result = {} for row in reader: for column, value in row.items(): result.setdefault(column, []).append(value) print('Column -> ', column, '\nValue -> ', value) print(result) fieldnames = result.keys() csvwriter = csv.DictWriter(open('C:\\Users\\Chris\\Desktop\\test_out.csv', 'w'), delimiter=',', fieldnames=result.keys()) csvwriter.writerow(dict((fn,fn) for fn in fieldnames)) for row in result.items(): print('Values -> ', row) #csvwriter.writerow(row) ''' Test output ''' test_array = [] test_array.append({'fruit': 'apple', 'quantity': 5, 'color': 'red'}); test_array.append({'fruit': 'pear', 'quantity': 8, 'color': 'green'}); test_array.append({'fruit': 'banana', 'quantity': 3, 'color': 'yellow'}); test_array.append({'fruit': 'orange', 'quantity': 11, 'color': 'orange'}); fieldnames = ['fruit', 'quantity', 'color'] test_file = open('C:\\Users\\Chris\\Desktop\\test_out.csv','w') csvwriter = csv.DictWriter(test_file, delimiter=',', fieldnames=fieldnames) csvwriter.writerow(dict((fn,fn) for fn in fieldnames)) for row in test_array: print(row) csvwriter.writerow(row) test_file.close() 

创build一个字典,然后迭代结果并填充字典中的行。 请注意,如果遇到具有重复date的行,则必须决定如何处理(引发exception,replace前一行,放弃较晚的行等)

这里是test.csv:

 Date,Foo,Bar 123,456,789 abc,def,ghi 

和相应的程序:

 import csv reader = csv.reader(open('test.csv')) result = {} for row in reader: key = row[0] if key in result: # implement your duplicate row handling here pass result[key] = row[1:] print result 

收益率:

 {'Date': ['Foo', 'Bar'], '123': ['456', '789'], 'abc': ['def', 'ghi']} 

或者,用DictReader:

 import csv reader = csv.DictReader(open('test.csv')) result = {} for row in reader: key = row.pop('Date') if key in result: # implement your duplicate row handling here pass result[key] = row print result 

结果是:

 {'123': {'Foo': '456', 'Bar': '789'}, 'abc': {'Foo': 'def', 'Bar': 'ghi'}} 

或者,您可能想要将列标题映射到该列的值列表:

 import csv reader = csv.DictReader(open('test.csv')) result = {} for row in reader: for column, value in row.iteritems(): result.setdefault(column, []).append(value) print result 

这产生:

 {'Date': ['123', 'abc'], 'Foo': ['456', 'def'], 'Bar': ['789', 'ghi']} 

你需要一个Python DictReader类。 更多的帮助可以从这里find

 import csv with open('file_name.csv', 'rt') as f: reader = csv.DictReader(f) for row in reader: print row 

你有没有考虑过使用Apache Solr ? 它支持search评分和轻松使用CSV文件数据。 你会发现它的规模令人印象深刻,并有许多其他选项来分析您的数据,例如支持多种语言或拼写错误的查询。

例子

  • 创build报告并上传到服务器进行下载
  • SOLR – 从csv文件导入2000万文件的最佳方法

@ phil-frost的帮助非常有帮助,正是我所期待的。

之后我做了一些调整,所以我想在这里分享一下:

 def csv_as_dict(file, ref_header, delimiter=None): import csv if not delimiter: delimiter = ';' reader = csv.DictReader(open(file), delimiter=delimiter) result = {} for row in reader: print(row) key = row.pop(ref_header) if key in result: # implement your duplicate row handling here pass result[key] = row return result 

你可以称之为:

 myvar = csv_as_dict(csv_file, 'ref_column') 

ref_colum将成为你每行的主键。