我的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。出现了一些奇怪的错误。
答案 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