有关Python CSV格式的建议

时间:2012-05-12 19:06:26

标签: python python-3.x

我编写了一个代码来执行一些简单的csv格式化,但我知道它不是那么好。

这是输入

1,a
1,b
1,c
2,d
2,e
3,a
3,d
3,e
3,f

这是我想要的输出

['1','a','b','c']
['2','d','e']
['3','a','d','e','f']

这是我写的代码

import csv
input = csv.reader(open('book1.csv'))
output = open('output.csv', 'w')
job=[0,0]
for row in input:
    if row[0] == job[1]:
        job.append(row[1])
    else:
        print(job)
        #output.write(",".join(job))
        job[1] = row[0]
        job = [job[0], job[1]]
        job.append(row[1])

这是输出

[0,0]
[0, '1', 'a', 'b', 'c']
[0, '2', 'd', 'e']

我的问题如下

如何完成该行的else语句?另外,如何在集合中添加0作为第0个元素。我也希望代码输出最后一个“作业”集。最后有没有人有任何改进此代码的建议?

我问,因为我希望在编写代码方面做得更好,而不是仅仅将它们混合在一起。任何回复将不胜感激! 提前致谢

2 个答案:

答案 0 :(得分:2)

您要做的是将第二列分组到第一列。 Python有一个工具,itertools.groupby

groups = itertools.groupby(input, key=operator.itemgetter(0))

是一个产生(key, group)元组的迭代器,其中key是行中的第一项,每个group是组中行的迭代器。

operator.itemgetter[]语法完全相同 - 获取指定的项目。 operator.itemgetter(0)与以下内容相同:

def itemgetter_0(seq_or_mapping):
    return seq_or_mapping[0]

要提取值并创建列表,您可以:

output = [[key] + map(operator.itemgetter(1), group) for key, group in groups]

使用key启动每个列表,然后从每行中提取第二个项目并将它们添加到列表中。

对于您的示例输入,输出将为:

[['1', 'a', 'b', 'c'], ['2', 'd', 'e'], ['3', 'a', 'd', 'e', 'f']]

答案 1 :(得分:1)

要“更好地编写代码”,您需要能够编写和理解细节代码,以及知道如何拨打快递groupby或其他任何内容。

尝试回答您提出的实际问题,以下是使代码有效所需的最小更改:

import csv
input = csv.reader(open('book1.csv'))
output = open('output.csv', 'w')
job = []
for row in input:
    if not job: # first row in input file
        job = row
    elif row[0] == job[0]:
        job.append(row[1])
    else:
        print(job)
        #output.write(",".join(job))
        job = row
if job: # emit the last job (if any)
    print(job)