2017-09-15 67 views
0

這裏只是一個來自新手的簡單問題,我已經打開了這個.csv文件,一切正常。Python中的CSV文件操作,總結與csv文件中的名稱相關的項目

我然後刪除頁眉和我留下這段代碼的相關信息的名稱和相關的值:

with open('troms_il.csv', 'r') as data_file: 
    csv_data = csv.reader(data_file) 

    # remove header from .csv 
    next(csv_data) 

    for line in csv_data: 
     byer.append(f"{line[3]}, {line[2]}") # these are the towns, and money subsidised. 
     print(byer) 

,我也得到:

['BALSFJORD, 116613', 'Harstad, 181419', 'Harstad, 128886', 'Harstad, 22950', 'Harstad, 24948', 'IBESTAD, 614244', 'IBESTAD, 41361', 'IBESTAD, 42318', 'LAVANGEN, 262014', 'LENVIK, 34609', 'LENVIK, 592512', 'LENVIK, 842530', 'LENVIK, 590166', 'LENVIK, 563900', 'LENVIK, 405785', 'LENVIK, 154078', 'NORDREISA, 239942', 'SKJERVØY, 57286', 'SKJERVØY, 38789', 'STORFJORD, 56283', 'TROMSØ, 155754', 'TROMSØ, 114005', 'TROMSØ, 300646', 'TROMSØ, 94538'] 

在這個例子中,所有的名字是城鎮,數字代表他們在一些補貼中獲得的資金。有幾個城鎮的重複分配給他們不同的金錢價值。我想知道如何在這裏得到每個城鎮的錢的總和。我只是不知道。

在此先感謝。

CSV文件看起來像這樣在做任何事情之前:

Søker,Anleggsnr,Tildelt beløp,Kommune,Anlegg 
Balsfjord Skytterlag,1933009401,116613,BALSFJORD,Nordkjosbotn skytebane 100m 
HARSTAD KLATREKLUBB,1901000107,181419,Harstad,Hølogalandshallen - klatrevegg 
HARSTAD KLATREKLUBB,1901000107,128886,Harstad,Hølogalandshallen - klatrevegg 
Harstad Orienteringslag,1901001602,22950,Harstad,Kanebogen orienteringskart 
Harstad Orienteringslag,1901001102,24948,Harstad,Medkila-Breivika orienteringskart 
Ibestad Golfklubb,1917002601,614244,IBESTAD,Ibestad Golfklubb 
Ibestad IL,1917003202,41361,IBESTAD,Sanitørbygg ørsand friluftspark 
Ibestad IL,1917003203,42318,IBESTAD,Tursti ørsand friluftspark 
Soløy Idrettsgruppe,1920001902,262014,LAVANGEN,Soløy lysløype 
Botnhamn IL,1931000201,34609,LENVIK,Botnhamn lysløype 
Finnsnes IL Allianse,1931000512,592512,LENVIK,Finnsnes IL Allianse utvidelse klubbhus 
Finnsnes IL Allianse,1931000513,842530,LENVIK,Finnsnes IL Allianse ny garderobe 
Finnsnes IL Allianse,1931000514,590166,LENVIK,Finnsnes IL Allianse lager 
Gisund Skytterlag,1931007303,563900,LENVIK,Gisund skytterbane rehab bane 
NMK Midt-Troms,1931011301,405785,LENVIK,Aspelund Motorsportanlegg 
Senja ski,1931005103,154078,LENVIK,Rehabilitering av løype inkl. utskifte lysarmatur Senja ski 
Nordreisa Rideklubb,1942002601,239942,NORDREISA,Nordreisa rideanlegg 
ørviksand Bygdelag,1941000104,57286,SKJERVØY,Turstier i ørviksand 2 
ørviksand Bygdelag,1941000103,38789,SKJERVØY,Turstier i ørviksand 1 
Storfjord IL,1939000401,56283,STORFJORD,Brenna lysløype 
Blømann IL,1902003905,155754,TROMSØ,Blømann Skatepark 
Reinen IL,1902014303,114005,TROMSØ,Reinen nørmiljøanlegg 
Tromsø Ryttersportklubb,1902007805,300646,TROMSØ,Tromsø Rideskole 
Vikingur Rideklubb,1902024202,94538,TROMSØ,Tromsø Travbane 
+0

請出示你已經使用在讀取數據的代碼 –

+0

請,做出更具體的標題。這是好的SO問題的要求。 – uhbif19

回答

1

我建議你一次讀一行文件。您可以使用strip()刪除最後一個換行符,並使用split(',')給出一個條目列表。

下一步使用字典來保存每個城鎮的值。如果字典已經有了該鎮的條目,只需將該值添加到現有值,否則創建一個新的鎮入口。

totals = {} 

with open('input.csv', newline='', encoding='utf8') as f_input: 
    next(f_input) # skip the header 

    for line in f_input: 
     row = line.strip().split(',') 
     town = row[3] 
     value = int(row[2]) 

     if town in totals: 
      totals[town] += int(value) 
     else: 
      totals[town] = int(value) 

for town in sorted(totals.keys()): 
    print("{} {}".format(town, totals[town])) 

給你輸出起點爲:

BALSFJORD 116613 
Harstad 358203 
IBESTAD 697923 

的Python還提供了這樣做更容易,如csv庫自動讀取文件作爲列表的工具。還有一個Counter()可用於自動總計您的值。

使用csvCounter()可以如下進行:

from collections import Counter 
import csv 

totals = Counter() 

with open('input.csv', newline='', encoding='utf8') as f_input: 
    csv_input = csv.reader(f_input) 
    header = next(csv_input) # skip the header 

    for row in csv_input: 
     totals[row[3]] += int(row[2]) 

for town in sorted(totals.keys()): 
    print("{} {}".format(town, totals[town])) 

print('LENVIK has', totals['LENVIK']) 
+0

錯誤的第5行,我得到:ValueError:沒有足夠的值來解壓縮(預計2,得到1) –

+0

檢查你的'input.csv'文件,看看你的任何行是否缺少','或者是否有空行(例如最後一行) –

+0

似乎沒有丟失任何逗號或任何空格。說如果我有我在問題中提出的清單,是否沒有真正簡單的方法來要求該城鎮以及它在.csv文件中出現的價值? –

1

首先,讓閱讀文件,以良好的數據結構:

csv_reader = csv.reader(open("filename", "r") 
towns = list(csv_reader)[1:] 

你也可以得到這個免費使用csv模塊。

然後我們可以用答案構造結構。這將是一個dict()

total_money = {} 
for town, money in towns: 
    current_money = total_money.get(town, 0) 
    total_money[town] = current_money + money 

另外還有更多的intuitve解決方案它的功能風格。

def town_money_list(current_town): 
    return [money for town, money if town == current_town] 

total_money = {town: sum(town_money_list(town)) for town, money in towns} 
+0

因此,對於我的csv文件,我是否仍然可以使用open('troms_il.csv','r')作爲data_file: csv_data = csv.reader(data_file) –

+0

以及您的代碼中的哪裏是實際列表我已經打開了,我對此感到非常可怕,這很令人費解。 –

+0

@JoakimCarlsen我改變了我的代碼,根據你到目前爲止做了什麼。希望現在很清楚。如果它解決了您的問題,您可以將我的問題標記爲已接受。 – uhbif19