【问题标题】:Python, Write new line to CSV using columns from multiple listsPython,使用多个列表中的列将新行写入 CSV
【发布时间】:2013-10-16 07:27:11
【问题描述】:

到目前为止,我能找到的只是与将列表合并在一起的问题。

我正在寻找 3 个列表(2 个列表和一个 2D 列表)

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

并将这些值写入 CSV 文件,结果如下 // Desired Output

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)

【问题讨论】:

    标签: python list csv python-2.7


    【解决方案1】:

    假设您已经知道要编写一个 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     
    

    【讨论】:

    • 再看看我需要做什么,将输出作为适当的逗号分隔列表很好。我已经相应地调整了问题。现在就去试试这个。
    • zip 确实是一个优雅的解决方案;我已将我提出的最终解决方案添加到问题中
    • @Simon:你不需要循环,如果你使用writer.writerows
    猜你喜欢
    • 1970-01-01
    • 2018-04-02
    • 2018-03-05
    • 2012-01-02
    • 2013-07-16
    • 2014-05-24
    • 2021-08-31
    • 2021-11-09
    • 1970-01-01
    相关资源
    最近更新 更多