编写csv文件python

时间:2013-02-06 09:44:07

标签: python excel csv

所以我有一个清单:

>>> 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

3 个答案:

答案 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

会像其他人所说的那样奏效。

由于混淆writerowwriterows,我的原始答案存在缺陷。