在CSV python中添加列并枚举它

时间:2014-04-24 06:54:29

标签: python csv enumerate

我的CSV看起来像

John,Bomb,Dawn
3,4,5
3,4,5
3,4,5

我想在前面添加ID列,如下所示:

ID,John,Bomb,Dawn
1,3,4,5
2,3,4,5
3,3,4,5

使用枚举功能,但我不知道如何。到目前为止,这是我的代码:

import csv

with open("testi.csv", 'rb') as input, open('temp.csv', 'wb') as output:
        reader = csv.reader(input, delimiter = ',')
        writer = csv.writer(output, delimiter = ',')

        all = []
        row = next(reader)
        row.append('ID')
        all.append(row)
        count = 0
        for row in reader:
                count += 1
                while count:
                        all.append(row)
                        row.append(enumerate(reader, 1))
                        break
        writer.writerows(all)

输出完全错误:

John,Bomb,Dawn,ID
3,4,5,<enumerate object at 0x7fb2a5728d70>
3,4,5,<enumerate object at 0x1764370>
3,4,5,<enumerate object at 0x17643c0>

因此ID最终应该在开始时,它甚至不会执行1,2,3。出现了一些奇怪的错误。

3 个答案:

答案 0 :(得分:3)

您应该使用insert()而不是append()。这将允许您指定要添加元素的索引。

试试这个

import csv

with open("testi.csv", 'rb') as input, open('temp.csv', 'wb') as output:
    reader = csv.reader(input, delimiter = ',')
    writer = csv.writer(output, delimiter = ',')

    all = []
    row = next(reader)
    row.insert(0, 'ID')
    all.append(row)
    count = 0
    for row in reader:
        count += 1
        row.insert(0, count)
        all.append(row)
    writer.writerows(all)

答案 1 :(得分:3)

我可以建议以下代码来解决您的问题:

import csv

with open("testi.csv", 'rb') as input, open('temp.csv', 'wb') as output:
    reader = csv.reader(input, delimiter = ',')
    writer = csv.writer(output, delimiter = ',')

    all = []
    row = next(reader)
    row.insert(0, 'ID')
    all.append(row)
    for k, row in enumerate(reader):
        all.append([str(k+1)] + row)
    writer.writerows(all)

更紧凑的代码可以是:

all = [['ID'] + next(reader)] + [[str(k+1)] + row for k, row in enumerate(reader)]

更新(一些解释):

您的错误enumerate功能理解。 enumerate循环中应使用for,当您遍历enumerate函数结果时,您将获得元组的序列,其中第一个项目是从列表中排序的项目数,第二个是项目本身。

但是enumerate函数返回是对象(docs)所以当你尝试将它转换为字符串时,它会调用__repr__魔术方法并将枚举对象强制转换为<enumerate object at ...>。< / p>

另一个词,enumerate有助于避免循环中的其他计数器,例如count += 1变量。

此处你有一个非常奇怪的代码:

while count:
    all.append(row)
    row.append(enumerate(reader, 1))
    break

这部分代码永远不能执行多次。

答案 2 :(得分:2)

您可以这样做:

import csv

with open('testi.csv') as inp, open('temp.csv', 'w') as out:
    reader = csv.reader(inp)
    writer = csv.writer(out, delimiter=',')
    #No need to use `insert(), `append()` simply use `+` to concatenate two lists.
    writer.writerow(['ID'] + next(reader))
    #Iterate over enumerate object of reader and pass the starting index as 1.
    writer.writerows([i] + row for i, row in enumerate(reader, 1))

enumerate()返回一个枚举对象,它一次生成一个元组中的索引和项,因此您需要遍历enumerate对象而不是将其写入csv文件。 / p>

>>> lst = ['a', 'b', 'c']
>>> e = enumerate(lst)
>>> e
<enumerate object at 0x1d48f50>
>>> for ind, item in e:
...     print ind, item
...     
0 a
1 b
2 c

<强>输出:

>>> !cat temp.csv
ID,John,Bomb,Dawn
1,3,4,5
2,3,4,5
3,3,4,5