在 CSV python 中添加列并枚举它

use*_*635 5 python csv enumerate

我的 CSV 看起来像

John,Bomb,Dawn
3,4,5
3,4,5
3,4,5
Run Code Online (Sandbox Code Playgroud)

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

ID,John,Bomb,Dawn
1,3,4,5
2,3,4,5
3,3,4,5
Run Code Online (Sandbox Code Playgroud)

使用 enumerate 函数,但我不知道如何。到目前为止,这是我的代码:

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)
Run Code Online (Sandbox Code Playgroud)

并且输出全错了:

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>
Run Code Online (Sandbox Code Playgroud)

所以 ID 最终出现,它应该在开始的时候,它甚至不做 1、2、3。出现了一些奇怪的错误。

Ale*_*xei 4

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

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)
Run Code Online (Sandbox Code Playgroud)

更紧凑的代码可以是:

all = [['ID'] + next(reader)] + [[str(k+1)] + row for k, row in enumerate(reader)]
Run Code Online (Sandbox Code Playgroud)

更新(一些解释):

您对功能的理解错误enumerateenumerate应该在for循环中使用,当您迭代enumerate函数结果时,您会得到元组的序列,其中第一项是列表中项目的有序数,第二项是项目本身。

enumerate函数返回是对象(文档),因此当您尝试将其转换为字符串时,它会调用__repr__魔术方法并将枚举对象转换为<enumerate object at ...>

换句话说,enumerate有助于避免循环中的额外计数器,例如count += 1变量。

另外你这里有一个非常奇怪的代码:

while count:
    all.append(row)
    row.append(enumerate(reader, 1))
    break
Run Code Online (Sandbox Code Playgroud)

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