编写csv文件python

hlx*_*hlx 2 python csv excel

所以我有一个清单:

>>> 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的东西

aba*_*ert 5

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)

关键是,找到一种方法来创建listlistS-如果你不能弄清楚都在你的头上,你可以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)