所以我有一个清单:
>>> print references
>>> ['Reference xxx-xxx-xxx-007 ', 'Reference xxx-xxx-xxx-001 ', 'Reference xxx-xxx-xxxx-00-398 ', 'Reference xxx-xxx-xxxx-00-399']
(列表比这长得多)
我需要写一个看起来像这样的CSV文件:
Column 1:
Reference xxx-xxx-xxx-007
Reference xxx-xxx-xxx-001
[...]
我试过了:
c = csv.writer(open("file.csv", 'w'))
for item in references:
c.writerows(item)
Or:
for i in range(0,len(references)):
c.writerow(references[i])
但是当我打开创建的csv文件时,我会看到一个窗口,要求我选择分隔符 无论如何,我都有类似的东西 R,E,F,E,R,E,N,C,ES
答案 0 :(得分:5)
writerows
获取一系列行,每行都是一系列列,并将它们写出来。
但是你只有一个list
的值。所以,你想要:
for item in references:
c.writerow([item])
或者,如果你想要一个单行:
c.writerows([item] for item in references)
关键是,每一行必须是一个序列;实际上,每一行只是一个字符串。
那么,为什么你得到R,e,f,e,r,e,n,c,e,…
而不是错误?好吧,字符串是一系列字符(每个字符本身就是一个字符串)。因此,如果您尝试将"Reference"
视为序列,则它与['R', 'e', 'f', 'e', 'r', 'e', 'n', 'c', 'e']
相同。
在评论中,你问:
现在如果我想在第二栏写一些内容怎么办?
那么,每行必须是两个项目的list
。例如,假设你有这个:
references = ['Reference xxx-xxx-xxx-007 ', 'Reference xxx-xxx-xxx-001 ']
descriptions = ['shiny thingy', 'dull thingy']
你可以这样做:
csv.writerows(zip(references, descriptions))
或者,如果你有这个:
references = ['Reference xxx-xxx-xxx-007 ', 'Reference xxx-xxx-xxx-001 ', 'Reference xxx-xxx-xxx-001 ']
descriptions = {'Reference xxx-xxx-xxx-007 ': 'shiny thingy',
'Reference xxx-xxx-xxx-001 ': 'dull thingy']}
你可以这样做:
csv.writerows((reference, descriptions[reference]) for reference in references)
关键是,找到一种方法来创建list
list
的{{1}} - 如果你无法解决所有问题,你可以print
所有中间步骤看看他们的样子 - 然后你可以打电话给writerows
。如果您只能弄清楚如何一次创建一个单行,请使用循环并在每一行上调用writerow
。
但是,如果获得第一列值,然后获得第二列值,该怎么办?
好吧,你不能在CSV中添加一个列;你只能按行写,而不是逐列。但是有一些方法可以解决这个问题。
首先,您可以按照转置顺序编写表格:
c.writerow(references)
c.writerow(descriptions)
然后,在将其导入Excel后,只需将其转置回来。
其次,不要在得到它们时写出值,而是将它们收集到一个列表中,然后在最后写出所有内容。像这样:
rows=[[item] for item in references]
# now rows is a 1-column table
# ... later
for i, description in enumerate(descriptions):
values[i].append(description)
# and now rows is a 2-column table
c.writerows(rows)
如果最糟糕的情况发生,您可以随时写入CSV,然后将其读回并写一个新的以添加列:
with open('temp.csv', 'w') as temp:
writer=csv.writer(temp)
# write out the references
# later
with open('temp.csv') as temp, open('real.csv', 'w') as f:
reader=csv.reader(temp)
writer=csv.writer(f)
writer.writerows(row + [description] for (row, description) in zip(reader, descriptions))
答案 1 :(得分:1)
writerow
将iterable的元素写入不同的列。这意味着如果你提供一个元组,每个元素将放在一列中。如果您提供String,则每个字母将放在一列中。如果您希望同一列中的所有内容执行以下操作:
c = csv.writer(open("file.csv", 'wb'))
c.writerows(references)
或
for item in references:
c.writerow(references)
答案 2 :(得分:0)
c = csv.writer(open("file.csv", 'w'))
c.writerows(["Reference"])
# cat file.csv
R,e,f,e,r,e,n,c,e
但是
c = csv.writer(open("file.csv", 'w'))
c.writerow(["Reference"])
# cat file.csv
Reference
会像其他人所说的那样奏效。
由于混淆writerow
和writerows
,我的原始答案存在缺陷。