Python:CSV按列而不是行写入

时间:2010-11-11 13:58:06

标签: python csv

我有一个python脚本,在while循环中生成一堆数据。我需要将此数据写入CSV文件,因此它按列而不是行进行写入。

例如,在我的脚本的循环1中,我生成:

(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

依此类推,直到while循环结束。有人能帮助我吗?


修改

while循环可以持续超过100,000个循环

8 个答案:

答案 0 :(得分:36)

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

答案 1 :(得分:6)

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

答案 2 :(得分:5)

大多数文件系统不支持更新文件中的行(文件中的一行只是一些以换行结束的数据,下一行就在此之后开始)。

我认为你有两种选择:

  1. 让您的数据生成循环成为生成器,这样他们就不会消耗大量内存 - 您将“及时”获取每一行的数据
  2. 使用数据库(sqlite?)并更新那里的行。完成后 - 导出为CSV
  3. 第一种方法的小例子:

    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生成无限的数字序列

答案 3 :(得分:1)

怎么样Result_*还会在循环中生成(因为我认为不可能添加到csv文件中)

我会这样的;生成所有数据,旋转矩阵写入文件:

A = []

A.append(range(1, 5))  # an Example of you first loop

A.append(range(5, 9))  # an Example of you second loop

data_to_write = zip(*A)

# then you can write now row by row

答案 4 :(得分:1)

让我们假设(1)你没有大内存(2)你在列表中有行标题(3)所有数据值都是浮点数;如果它们都是高达32位或64位的整数,那就更好了。

在32位Python上,将float存储在列表中对于float对象需要16个字节,对于列表中的指针需要4个字节;总计20.在array.array('d')中存储一个浮点只需要8个字节。如果您的所有数据都是int(任何底片?),那么可以获得越来越多的节省,这些数据将适合8,4,2或1个字节 - 特别是在最近的所有整数都很长的Python上。

以下伪代码假定浮点数存储在array.array('d')中。如果你真的没有内存问题,你仍然可以使用这种方法;如果您想使用列表,我会发表评论以指出所需的更改。

# Preliminary:
import array # list: delete
hlist = []
dlist = []
for each row: 
    hlist.append(some_heading_string)
    dlist.append(array.array('d')) # list: dlist.append([])
# generate data
col_index = -1
for each column:
    col_index += 1
    for row_index in xrange(len(hlist)):
        v = calculated_data_value(row_index, colindex)
        dlist[row_index].append(v)
# write to csv file
for row_index in xrange(len(hlist)):
    row = [hlist[row_index]]
    row.extend(dlist[row_index])
    csv_writer.writerow(row)

答案 5 :(得分:1)

逐行读取,然后在命令行中转置它。如果您使用的是Unix,请安装csvtool并按照以下指示操作:https://unix.stackexchange.com/a/314482/186237

答案 6 :(得分:0)

作为替代流媒体方式:

  • 将每个col转储到文件
  • 使用python或unix paste命令重新加入tab,csv等等。

这两个步骤都应该处理好。

缺陷:

  • 如果您有1000列,则可能会遇到unix文件句柄限制!

答案 7 :(得分:0)

经过一段时间的思考,我想出了一种更简单的方法来实现相同的目标。假设你有如下代码:

leftright = 100
topbottom = 100