在Python中读取csv文件并创建字典

时间:2013-03-14 02:34:10

标签: python csv dictionary

我有一个像这样的csv数据集:

A, 10, USA
B,30, UK
C,4,IT
A,20,UK
B,10,USA

我想阅读这些csv行并提供以下输出:

A has ran 30 miles with average of 15. 
B has ran 30 miles with average of 20.
C has ran 4 miles with average of 4. 

到目前为止,我的解决方案是读取csv数据并将它们转换为字典,然后对它们进行迭代,以查看“A”重复了多少次以及它必须为平均值计算的值,并最终生成结果。我已经编写了这段代码,但是我很难有效地计算A重复的次数并将里程相加以创建我的最终输出。有什么想在Python中做到这一点?我在C#中很容易做到这一点,但我对Python不太好。

def main(filename):
    f = open(filename,'r')
    labels = ['name','miles','country']
    data = csv.DictReader(f,labels,delimiter=',')
    for line in data:
        print (line['name']+"  " + "has ran" +"   "+  line['miles']+" "+"miles")

    f.close()

3 个答案:

答案 0 :(得分:6)

您可以使用defaultdict存储值,然后将其打印出来:

import csv

from collections import defaultdict

with open(filename, 'r') as handle:
    reader = csv.DictReader(handle, ['name', 'miles', 'country'])
    data = defaultdict(list)

    for line in reader:
        data[line['name']).append(int(line['miles']))

    for runner, distances in data.items():
        print '{} ran a total of {} miles and an average of {} miles'.format(
            runner, sum(distances), sum(distances) / float(len(distances))
        )

答案 1 :(得分:1)

我的循环使用拆分如下:

var1,var2,var3 = line.split(“,”)

这将获得每个变量中行中的每个值。然后根据需要使用变量。

答案 2 :(得分:1)

您可以执行以下操作:

  1. 为您的数据添加标题行(例如," Runner,Distance,Country")。
  2. 将其保存到文件(例如log.csv)。
  3. 在此处使用load_csv函数加载它:https://github.com/kdavies4/ModelicaRes/blob/master/modelicares/util.py#L676 通过在那里下载util.py文件并执行以下操作:

    from util import load_csv
    d = load_csv("log.csv")
    

    您最终应该使用以下词典:

    d = {'Runner': ['A', 'B', 'C', 'A', 'B'], 'Distance': [10, 30, 4, 20, 10], 'Country': ['USA', 'UK', 'IT', 'UK', 'USA']}
    

    load_csv函数使用csv.reader自动创建一个字典,其中的键以在标题行中找到的条目命名。每个键的字典条目是相应列的值列表。文档在这里: http://kdavies4.github.io/ModelicaRes/util.html#modelicares.util.load_csv。 util.py文件包含许多其他功能,但您可以安全地删除它们(只要您将import numpy as np保留在顶部)。

  4. 运行以下代码计算平均距离:

    # Create counter dictionaries for the statistics.
    from collections import Counter
    n_runs = Counter()
    totals = Counter()
    
    # Calculate the total distance.
    for runner, distance in zip(d['Runner'], d['Distance']):
        n_runs[runner] += 1
        totals[runner] += distance
    
    # Print the results.
    for runner in set(d['Runner']):
        print("%s has run %i miles with an average of %g."
              % (runner, totals[runner], totals[runner]/float(n_runs[runner])))
    
  5. 这应该可以为您提供所需的结果,如果数据被扩展(按行或列),它应该是灵活的。

    凯文