Python:CSV按列而不是按行写入

1mrurvl1  于 2022-12-25  发布在  Python
关注(0)|答案(9)|浏览(141)

我有一个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次循环

cigdeys3

cigdeys31#

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

46scxncf2#

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

wgxvkvu93#

更新行在文件中的地方是不支持在大多数文件系统(一个文件中的一行只是一些数据,以换行符结束,下一行就在这之后开始)。
在我看来你有两个选择:
1.让数据生成循环成为生成器,这样它们就不会消耗大量内存--您将“及时”地获得每行的数据
1.使用一个数据库(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生成一个无穷数列

0vvn1miw

0vvn1miw4#

让我们假设(1)你没有一个大的内存(2)你在一个列表中有行标题(3)所有的数据值都是浮点数;如果它们都是32位或64位的整数,那就更好了。
在32位Python中,在列表中存储一个float对象需要16个字节,在列表中存储一个指针需要4个字节; total 20.在array.array('d')中存储一个float只需要8个字节。如果你所有的数据都是int型的(有负数吗?),可以容纳8、4、2或1个字节--特别是在最近的Python中,所有的int型都是long型的。
下面的伪代码假设浮点数存储在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)
mwyxok5s

mwyxok5s5#

Result_*怎么样,循环中也会生成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
odopli94

odopli946#

逐行读入,然后在命令行中转置。如果您使用Unix,请安装csvtool并按照中的说明操作:https://unix.stackexchange.com/a/314482/186237

lh80um4z

lh80um4z7#

作为一种替代流方法:

  • 将每列转储到文件中
  • 使用python或unix粘贴命令在tab,csv,无论什么上重新加入。

这两个步骤应该处理蒸刚刚好。
陷阱:

  • 如果你有1000 s的列,你可能会碰到unix文件句柄限制!
ruyhziif

ruyhziif8#

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

fruitList = ["Mango", "Apple", "Guava", "Grape", "Orange"]
vegList = ["Onion", "Garlic", "Shallot", "Pumpkin", "Potato"]
with open("NEWFILE.csv", "w") as csvfile:
    writer = csv.writer(csvfile)
    for value in range(len(fruitList)):
        writer.writerow([fruitList[value], vegList[value]])
c86crjj0

c86crjj09#

zip只接受长度等于列表最短长度的元素。如果列的长度相等,则需要使用zip_longest

import csv
from itertools import zip_longest

data = [[1,2,3,4],[5,6]]
columns_data = zip_longest(*data)

with open("file.csv","w") as f:
    writer = csv.writer(f)
    writer.writerows(columns_data)

相关问题