所以我有一个清单:
>>> print references
>>> ['Reference xxx-xxx-xxx-007 ', 'Reference xxx-xxx-xxx-001 ', 'Reference xxx-xxx-xxxx-00-398 ', 'Reference xxx-xxx-xxxx-00-399']
Run Code Online (Sandbox Code Playgroud)
(列表比这长得多)
我需要编写一个CSV文件,它看起来像这样:
Column 1:
Reference xxx-xxx-xxx-007
Reference xxx-xxx-xxx-001
[...]
Run Code Online (Sandbox Code Playgroud)
我试过这个:
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])
Run Code Online (Sandbox Code Playgroud)
但是当我打开创建的csv文件时,我得到一个窗口,要求我选择分隔符无论如何,我有类似R,e,f,e,r,e,n,c,es的东西
writerows
获取一系列行,每行都是一系列列,并将它们写出来.
但是你只有一个list
价值观.所以你要:
for item in references:
c.writerow([item])
Run Code Online (Sandbox Code Playgroud)
或者,如果你想要一个单行:
c.writerows([item] for item in references)
Run Code Online (Sandbox Code Playgroud)
关键是,每一行必须是一个序列; 实际上,每一行只是一个字符串.
那么,你为什么得到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']
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
csv.writerows(zip(references, descriptions))
Run Code Online (Sandbox Code Playgroud)
或者,如果你有这个:
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']}
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
csv.writerows((reference, descriptions[reference]) for reference in references)
Run Code Online (Sandbox Code Playgroud)
关键是,找到一种方法来创建list
的list
S-如果你不能弄清楚都在你的头上,你可以print
所有的中间步骤,看他们的样子,然后你可以调用writerows
.如果您只能弄清楚如何一次创建一个单行,请使用循环并调用writerow
每一行.
但是,如果您获得第一列值,然后获得第二列值,该怎么办?
好吧,你不能在CSV中添加一列; 你只能按行写,而不是逐列.但是有一些方法可以解决这个问题.
首先,您可以按照转置顺序编写表:
c.writerow(references)
c.writerow(descriptions)
Run Code Online (Sandbox Code Playgroud)
然后,在将其导入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)
Run Code Online (Sandbox Code Playgroud)
如果最坏的情况发生,您可以随时写入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))
Run Code Online (Sandbox Code Playgroud)