【问题标题】:Sum of a particular column in a csv filecsv 文件中特定列的总和
【发布时间】:2014-06-10 15:45:59
【问题描述】:

有一个 csv 文件,比如 A.csv,有内容:

Place,Hotel,Food,Fare

Norway,Regal,NonVeg,5000    
Poland,Jenny,Italiano,6000    
Norway,Suzane,Vegeterian,4000   
Norway,Regal,NonVeg,5000

我必须解析这个 csv 并通过在命令提示符中传递参数来获得输出。

示例 1:

mycode.py Place

期望的输出是:

Place,Fare    
Norway,14000  
Poland,6000

示例 2:

mycode.py Place Hotel

期望的输出是:

Place,Hotel,Fare
Norway,Regal,10000  
Poland,Jenny,6000  
Norway,Suzane,4000

因此,从上面的示例中可以清楚地看出,无论您作为参数传递什么,它都会为您提供常见的 Fare 标头的总和。

下面是我的代码,我可以传递参数并获得输出,但我被困在Fare 的总和中。谁能帮我解决这个问题。

import sys
import csv
import collections

d = collections.defaultdict(list)

Data = []
Result = []
Final = []
Argvs = []
argv_len = len(sys.argv)
index = 0
input = ''

file = open('A.csv', 'rb')
try:
    reader = csv.reader(file)
    for row in reader:
        Data.append(row)

    for x in range(1, argv_len):
        Argvs.append(sys.argv[x])
    Argvs.append('Fare')

    for input in Argvs:
        for y in range(0, len(Data[0])):
            if(input == Data[0][y]):
                for z in range(1, len(Data)):
                    Result.append(Data[z][y])                   
                break       
        Final.append(Result)
        Result = []

    New = []
    NewFinal = []
    for x in range(0, len(Final[0])):
        for y in range(0, len(Final)):
            New.append(Final[y][x])
        NewFinal.append(New)
        New = []
    out = {}
    for a in NewFinal:
        out.setdefault(a[0],[]).append(int(a[-1]))
    with open("output.csv", "wb") as csv_file:
        writer = csv.writer(csv_file,  dialect='excel', delimiter=',')
        writer.writerow(Argvs)
        for k,v in out.iteritems():
            writer.writerow((k,sum(v)))
except Exception,e:
    print str(e)
finally:
    file.close()

我编辑了代码并尝试对其进行分组。现在我能够得到Fare 的聚合,但不是所需的输出。

所以当我经过时:

mycode.py Place Hotel

代替:

Place,Hotel,Fare  
Norway,Regal,10000  
Poland,Jenny,6000  
Norway,Suzane,4000  

我得到:

Place,Hotel,Fare  
Norway,14000  
Poland,6000  

【问题讨论】:

  • “卡在总数中”是什么意思?你不会对'Count' 做任何事情;它不是数据中的标题,因此永远不会添加到Final。您似乎没有任何用于汇总数据的代码,到目前为止,您的代码只是获取没有任何分组的列。另外,'State' != 'Place'.
  • 'Count' 是指'Fare' 吗?如果是这样,这就是为什么你一无所获;您要检索的“标题”必须与实际数据一致。为什么您的第二个示例没有标题 'Hotel'
  • 这看起来不像 CSV ...
  • 非常抱歉。我在创建示例和发布我的实际代码时心不在焉。我的坏:(。编辑了代码。希望现在能给出更好的主意。@jonrsharpe

标签: python parsing python-2.7 csv dictionary


【解决方案1】:

最后我设法得到了我想要的输出。
下面我分享最终代码。 \

import sys
import csv

Data = []
Result = []
Final = []
Argvs = []
argv_len = len(sys.argv)
index = 0
input = ''

file = open('A.csv', 'rb')
try:
    reader = csv.reader(file)
    for row in reader:
        Data.append(row)

    for x in range(1, argv_len):
        Argvs.append(sys.argv[x])
    Argvs.append('Fare')

    for input in Argvs:
        for y in range(0, len(Data[0])):
            if(input == Data[0][y]):
                for z in range(1, len(Data)):
                    Result.append(Data[z][y])                   
                break       
        Final.append(Result)
        Result = []

    New = []
    NewFinal = []
    for x in range(0, len(Final[0])):
        for y in range(0, len(Final)):
            New.append(Final[y][x])
        NewFinal.append(New)
        New = []
    out = {}
    for a in NewFinal:
        count_val = a[-1]
        del a[-1]
        key_val = ','.join(a)
        out.setdefault(key_val.strip('"'),[]).append(int(count_val))
    with open("output.csv", "wb") as csv_file:
        writer = csv.writer(csv_file, delimiter=',',quotechar=' ')
        writer.writerow(Argvs)
        for k,v in out.iteritems():
            writer.writerow((k,sum(v)))
except Exception,e:
    print str(e)
finally:
    file.close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多