2017-09-15 63 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