使用python以特定方式在csv文件中添加列值

时间:2010-07-12 07:47:36

标签: python csv

我有一个类似于以下内容的csv文件:

title  title2  h1  h2  h3 ... 
l1.1     l1     1   1   0  
l1.2     l1     0   1   0
l1.3     l1     1   0   1
l2.1     l2     0   0   1
l2.2     l2     1   0   1
l3.1     l3     0   1   1
l3.2     l3     1   1   0
l3.3     l3     1   1   0
l3.4     l3     1   1   0    

我希望能够以下列方式添加列:
h1(l1.1 + l1.2 + l1.3)= 2
h1(l2.1 + l2.2)= 1
每列的h1(l3.1 + l3.2 + l3.3 + l3.4)= 3等等 我希望每个这样的值的最终计数作为汇总表:

title2  h1  h2  h3...
l1     2   2   1
l2     1   0   2
l3     3   4   1

我该如何实现?

2 个答案:

答案 0 :(得分:2)

这样的事情应该有效。它需要以

形式输入
title,title2,h1,h2,h3
l1.1,l1,1,1,0
l1.2,l1,0,1,0
l1.3,l1,1,0,1
l2.1,l2,0,0,1
l2.2,l2,1,0,1
l3.1,l3,0,1,1
l3.2,l3,1,1,0
l3.3,l3,1,1,0
l3.4,l3,1,1,0

和输出

title2,h1,h2,h3
l1,2,2,1
l2,1,0,2
l3,3,4,1

使用Python 3.1.2测试。在Python 2.x中,您需要更改open()调用以使用二进制模式,并删除newline=""位。您也可以将调用放到list(),因为在Python 2.x中,map()已经返回一个列表。

import csv
import operator

reader = csv.reader(open("test.csv", newline=""), dialect="excel")
result = {}

for pos, entry in enumerate(reader):
    if pos == 0:
        headers = entry
    else:
        if entry[1] in result:
            result[entry[1]] = list(map(operator.add, result[entry[1]], [int(i) for i in entry[2:]]))
        else:
            result[entry[1]] = [int(i) for i in entry[2:]]

writer = csv.writer(open("output.txt", "w", newline=""), dialect="excel")
writer.writerow(headers[1:])

keys = sorted(result.keys())
for key in keys:
    output = [key]
    output.extend(result[key])
    writer.writerow(output)

答案 1 :(得分:0)

看看csv模块。你想要做的是用csv.reader打开文件。然后迭代文件,当时一行。您将添加的结果累积到临时列表中。完成后,将此列表写入新的csv.writer。

您可能需要定义一个方言,因为您实际上并没有使用CSV,而是使用制表符分隔的格式。