如何将可变长度列表转换为CSV文件?

2024-03-29 12:04:07 发布

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

我正在解决工作中的一个问题,它要求我将列列表转换为唯一的CSV格式。我之所以说独特,是因为我还没有看到关于我的特殊问题的解释。我的研究把我引向了两个类似的问题,比如Sameer Pateluser1403483,我试过了,但结果不正确;让我解释一下。你知道吗

以下是我的数据示例:

animals = [['dog',
            ['a','b','c','d'],
            ['aa','aa'],
            ['bb','bb','bb','bb','bb']],
           ['cat',
            ['a','b','c'],
            [''],
            ['bb','bb']],
           ['bear',
            ['a'],
            ['aa','aa','aa'],
            ['bb']]]

该问题要求CSV的格式(在Excel中打开时)如下所示:

+------+------+------+------+
| dog  | a    | aa   | bb   |
+------+------+------+------+
|      | b    | aa   | bb   |
+------+------+------+------+
|      | c    |      | bb   |
+------+------+------+------+
|      | d    |      | bb   |
+------+------+------+------+
|      |      |      | bb   |
+------+------+------+------+
| cat  | a    |      | bb   |
+------+------+------+------+
|      | b    |      | bb   |
+------+------+------+------+
|      | c    |      |      |
+------+------+------+------+
| bear | a    | aa   | bb   |
+------+------+------+------+
|      |      | aa   |      |
+------+------+------+------+
|      |      | aa   |      |
+------+------+------+------+

pprint,csv,pandas中是否有Python函数来执行此操作,或者我是否需要创建一个函数来生成CSV输出以创建表?你知道吗


Tags: csv数据函数示例列表格式cataa
2条回答

我对您的数据格式做了一些假设,因为您的问题中没有包含有效的Python。你知道吗


可以使用itertools.zip_longest将列旋转为行:

import csv
from itertools import zip_longest

animals = [
    [
        "dog",
        ["a", "b", "c", "d"],
        ["aa", "aa"],
        ["bb", "bb", "bb", "bb", "bb"],
    ],
    [
        "cat",
        ["a", "b", "c"], [""], ["bb", "bb"],
    ],
    [
        "bear", ["a"], ["aa", "aa", "aa"], ["bb"]
    ],
]

allrows = []
for data in animals:
    name = data.pop(0)
    rows = list(zip_longest(*data, fillvalue=''))
    for i in range(len(rows)):
        if i:
            rows[i] = ('',) + rows[i]
        else:
            rows[i] = (name,) + rows[i]

    allrows.extend(rows)

with open('output.csv', 'w') as fd:
    writer = csv.writer(fd)
    for row in allrows:
        writer.writerow(row)

以上将输出:

dog,a,aa,bb
,b,aa,bb
,c,,bb
,d,,bb
,,,bb
cat,a,,bb
,b,,bb
,c,,
bear,a,aa,bb
,,aa,
,,aa,

如果我们格式化得很好的话:

    -      
dog   a  aa  bb
      b  aa  bb
      c      bb
      d      bb
             bb
cat   a      bb
      b      bb
      c
bear  a  aa  bb
         aa
         aa
    -      

…我想这就是你要找的。你知道吗

给定您的数据,下面将提取动物名称,并将列数据转置到您要查找的行中。你知道吗

import csv
import itertools

animals = [['dog',
            ['a','b','c','d'],
            ['aa','aa'],
            ['bb','bb','bb','bb','bb']],
           ['cat',
            ['a','b','c'],
            [''],
            ['bb','bb']],
           ['bear',
            ['a'],
            ['aa','aa','aa'],
            ['bb']]]

# open() recommended for Excel to write any kind of Unicode string data
with open('data.csv','w',newline='',encoding='utf-8-sig') as f:
    w = csv.writer(f)
    for name,*data in animals:
        data.insert(0,[name]) # adjust animal name string to 1-element list.
        for row in itertools.zip_longest(*data):
            w.writerow(row)

你知道吗数据.csv地址:

dog,a,aa,bb
,b,aa,bb
,c,,bb
,d,,bb
,,,bb
cat,a,,bb
,b,,bb
,c,,
bear,a,aa,bb
,,aa,
,,aa,

Excel:

data.csv opened in Excel

相关问题 更多 >