簡體   English   中英

在Python中讀取csv文件並創建字典

[英]reading csv file in Python and creating 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()

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

我的循環使用拆分如下:

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

這將獲得每個變量中行中的每個值。 然后根據需要使用變量。

您可以執行以下操作:

  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]))) 

這應該為您提供所需的結果,並且如果數據被擴展(按行或列),它應該是靈活的。

凱文

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM