Python: 按列而非按行写入CSV

58 投票
9 回答
252293 浏览
提问于 2025-04-16 06:54

我有一个Python脚本,它在一个循环里生成很多数据。我需要把这些数据写入一个CSV文件,但我希望它是按列写入,而不是按行。

比如在我的脚本的第一次循环中,我生成了:

(1, 2, 3, 4)

我希望在我的CSV文件中显示成这样:

Result_1    1
Result_2    2
Result_3    3
Result_4    4

在我的第二次循环中,我生成了:

(5, 6, 7, 8)

我希望在CSV文件中看起来是这样:

Result_1    1    5
Result_2    2    6
Result_3    3    7
Result_4    4    8

然后这样继续,直到这个循环结束。有没有人能帮我一下?


补充说明

这个循环可能会超过100,000次。

9 个回答

6

在大多数文件系统中,直接在文件中更新某一行是不支持的(文件中的一行就是一些以换行符结尾的数据,下一行的数据紧接着在那之后开始)。

我认为你有两个选择:

  1. 让你的数据生成循环变成生成器,这样它们不会占用太多内存——你可以“及时”获取每一行的数据。
  2. 使用数据库(比如sqlite),在那里面更新行。当你完成后,再导出为CSV格式。

下面是第一种方法的小例子:

from itertools import islice, izip, count
print list(islice(izip(count(1), count(2), count(3)), 10))

这将会打印出

[(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6), (5, 6, 7), (6, 7, 8), (7, 8, 9), (8, 9, 10), (9, 10, 11), (10, 11, 12)]

尽管 count 生成的是一个无限的数字序列。

29
wr.writerow(item)  #column by column
wr.writerows(item) #row by row

如果你只是想把输出写成一列一列的,这个其实很简单。

如果你的项目是一个列表:

yourList = []

with open('yourNewFileName.csv', 'w', ) as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    for word in yourList:
        wr.writerow([word])
53

之所以csv不支持这个,是因为大多数文件系统并不真正支持可变长度的行。你应该做的是先把所有数据收集到列表里,然后再用zip()函数把它们转置过来。

>>> l = [('Result_1', 'Result_2', 'Result_3', 'Result_4'), (1, 2, 3, 4), (5, 6, 7, 8)]
>>> zip(*l)
[('Result_1', 1, 5), ('Result_2', 2, 6), ('Result_3', 3, 7), ('Result_4', 4, 8)]

撰写回答