【问题标题】:reading csv file in Python and creating dictionary在 Python 中读取 csv 文件并创建字典
【发布时间】:2013-03-02 06:20:49
【问题描述】:

我有一个这样的 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()

【问题讨论】:

    标签: python csv dictionary


    【解决方案1】:

    您可以使用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))
            )
    

    【讨论】:

    • 如果 csv 数据集中的行超过 1000s,您认为这是一个好的解决方案吗?我希望这个解决方案不是 O(n^2),那样会把事情搞砸。
    • @user843681:是O(n)。您对 CSV 和结果进行一次迭代以将其打印出来。
    【解决方案2】:

    我你的循环使用 split 如下:

    var1, var2, var3 = line.split(",")

    这将为您获取每个变量中的行中的每个值。然后随意使用变量。

    【讨论】:

    • Ops,我没注意到你要计算平均值。
    • 是的,这就是诀窍。起初它看起来很简单,但如果你是 Python 新手,它会特别吸引你。
    【解决方案3】:

    您可以执行以下操作:

    1. 为您的数据添加标题行(例如,“跑步者、距离、国家/地区”)。
    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])))
      

    这应该会给您想要的结果,并且如果数据被扩展(按行或列),它应该是灵活的。

    凯文

    【讨论】:

      猜你喜欢
      • 2015-10-01
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      相关资源
      最近更新 更多