组合CSV文件中的行并使用Python更新数量

时间:2015-09-22 23:53:20

标签: python csv

我是python的新手,我正在尝试从我的家具软件中获取零件清单,并以更好的方式组织它。我从一个csv文件开始,将每个部分写为自己的项目。所以,如果我有2个椅子腿是同一件,我得

Leg 1,x,y,z,notes  
Leg 2,x,y,z,notes  

我想最终得到的是

2,Leg 1,x,y,z,notes  

其中第一列现在是数量,并且只要python看到具有相同x,y,z,notes的新行,就会更新。

现在我有一个代码,我从其他帖子中找到了大部分代码,可以编写一个消除重复的文件,而且我似乎应该能够相对容易地添加数量,但我不能完全想办法。我查看了其他帖子,但没有看到有关在同一文件中更新的任何内容,只将一个文件与另一个文件进行比较 这是我用来消除重复的代码:

import csv

input_file  = 'Brook Field 4 Drawer.csv'
output_file = 'updated_quantities.csv'

with open(input_file, 'rb') as infile, open(output_file, 'wb') as outfile:
    incsv = csv.reader(infile)
    outcsv = csv.writer(outfile)

    pieces = set()
    for row in incsv:
        piece = tuple(row[1:4])
        if piece not in pieces:
            outcsv.writerow(row)
            pieces.add(piece)  

有人可以提出解决方案吗?我现在还在正确的轨道上吗?

2 个答案:

答案 0 :(得分:0)

你走了:

from itertools import groupby

csv_content = \
    [['Leg', '1', 'x', 'y', 'z', 'notes'],
     ['Leg', '2', 'x', 'y', 'z', 'notes'],
     ['Leg', '3', 'abc', 'y', 'z', 'notes']]

groups = {str(l[2:]): l for l in csv_content}

for key, group in groupby([str(e[2:]) for e in csv_content]):
    groups[key].insert(0, len(list(group)))

csv_read_output = list(groups.itervalues())

部分灵感来自:How to count the frequency of the elements in a list?

答案 1 :(得分:0)

不太对劲。而不是“设置”你需要一个字典我想,所以你可以在找到项目时继续增加一个计数器。以下是我的建议:

pieces = {}
for row in incsv:
    piece = tuple(row)
    if piece not in pieces:
        pieces[piece] = 0
    else:
        pieces[piece] += 1
for item, count in pieces.items():
    row = (count,) + item
    outcsv.writerow(row)