Python,使用多个列表中的列向CSV写入新行

2024-05-23 18:17:19 发布

您现在位置:Python中文网/ 问答频道 /正文

到目前为止,我所能找到的只是有关合并列表的问题。

我想要三张单子(两张单子和一张二维单子)

list1 = [[1,11,12],[2,21,22],[3,31,32]]
list2 = [4,5,6]
list3 = [7,8,9]

并将这些值写入CSV文件,得到所需的输出//

Row1,Row2,Row3 
1,4,7 
2,5,8
3,6,9

11、12等不应写入CSV文件。

代码:

f = open('file.csv', 'wb')
fileWriter = csv.writer(f)
fileWriter.writerow(['Row1', 'Row2', 'Row3']) # Write header row

尝试:

listlen = len(list2)
list1len = len(list1)

for i in range(listlen):
    for j in range(listlen):
        for k in range(list1len):
            fileWriter.writerow([list1[k][0],list2[i],list3[j]])

结果:

Row1,Row2,Row3
1,4,7
2,4,7
3,4,7

尝试:

for A,B,C in list1:
for X in list2:
    for Y in list3:
        tempA = A
        tempX = X
        tempY = Y
        fileWriter.writerow([tempA,tempX,tempY])

结果:

Row1,Row2,Row3
1,4,7
1,4,8
1,4,9
etc. 

当前代码(两次尝试)正在遍历list2和list3中list1中每个单个数字值的所有值。在这两次尝试之间,我所能做的就是改变写出的数字的顺序。

我想做的是写出每个列表的第一个值,然后是第二个值等等,以给出所需的输出。

我怎样才能调整这个以获得期望的输出/有更好的选择吗?

仅限Python 2.7

添加了我根据Abhijit的答案创建的解决方案:

result = zip(zip(*list1)[0], list2, list3)

for row in result:
    tempRow = row
    fileWriter.writerow(tempRow)

Tags: in列表forrange单子rowrow1row2
1条回答
网友
1楼 · 发布于 2024-05-23 18:17:19

假设您已经知道,要编写csv,您可能想知道的部分是访问数据的优雅方式。

访问数据的一个很好的方法是使用内置的zipzip([iterable, ...])具有优雅的数据转置能力,而且您在这里需要的是

>>> zip(zip(*list1)[0], list2, list3)
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

不幸的是,您正在考虑的目标结果是格式化的数据,而不是csv,因此即使您将csv写为制表符分隔的,结果也可能不理想

>>> result = [['row1','row2','row3']] + zip(zip(*list1)[0], list2, list3)
>>> with open('file.csv', 'wb') as fin:
    writer = csv.writer(fin, delimiter = '\t')
    writer.writerows(result)

row1    row2    row3
1   4   7
2   5   8
3   6   9

一种选择是放弃csv的概念,而是使用str.format将数据作为格式化字符串写入。

>>> header = ['row1','row2','row3']
>>> result = zip(zip(*list1)[0], list2, list3)
>>> format_string = "{:<10}{:<10}{:<10}"
>>> with open('file.csv', 'wb') as fin:
    fin.write(format_string.format(*header))
    fin.write('\n')
    for row in result:
        fin.write(format_string.format(*row))
        fin.write('\n')


row1      row2      row3      
1         4         7         
2         5         8         
3         6         9     

相关问题 更多 >