【问题标题】:Using Zip Function to Create Columns in CSV with non-identical lengths of data使用 Zip 函数在 CSV 中创建具有不同数据长度的列
【发布时间】:2019-07-15 23:40:45
【问题描述】:

我有大量的文件是根据逐渐更具体的标准命名的。

由“_”分隔的文件名的每个部分都与该文件的深入分类相关。

命名约定是这样的:

TEAM_STRATEGY_ATTRIBUTION_TIMEFRAME_DATE_FILEVIEW

我正在尝试做的是遍历所有这些文件,然后提取每个命名约定存在多少个不同出现的列表。

所以基本上这就是我到目前为止所做的,我遍历了所有文件并列出了每个名称。然后我用“_”分隔每个名称,然后将每个名称附加到各自的类别列表中。

现在我正在尝试将它们导出到按列分隔的 CSV 文件,这就是我遇到问题的地方

L = [teams, strategies, attributions, time_frames, dates, file_types]

columns = zip(*L)
list(columns)

with open (_outputfolder_, 'w') as f:
    writer = csv.writer(f)
    for column in columns:
        print(column)

这是对我列出的列表的粗略估计:

[{'TEAM1'}, 
{'STRATEGY1', 'STRATEGY2', 'STRATEGY3', 'STRATEGY4', 'STRATEGY5', 'STRATEGY6', 'STRATEGY7', 'STRATEGY8', 'STRATEGY9', 'STRATEGY10','STRATEGY11', 'STRATEGY12', 'STRATEGY13', 'STRATEGY14', 'STRATEGY15'}, 
{'ATTRIBUTION1','ATTRIBUTION1','Attribution3','Attribution4','Attribution5', 'Attribution6', 'Attribution7', 'Attribution8', 'Attribution9', 'Attribution10'}, 
{'TIME_FRAME1', 'TIME_FRAME2', 'TIME_FRAME3', 'TIME_FRAME4', 'TIME_FRAME5', 'TIME_FRAME6', 'TIME_FRAME7'}, 
{'DATE1'}, 
{'FILE_TYPE1', 'FILE_TYPE2'}]

我希望最终结果看起来像这样:

Team1    STRATEGY1    ATTRIBUTION1    TIME_FRAME1    DATE1    FILE_TYPE1
         STRATEGY2    ATTRIBUTION2    TIME_FRAME2             FILE_TYPE2
         ...          ...             ...                  
         etc.         etc.            etc.

但只有第一行实际存储在 CSV 文件中。

谁能帮我理解如何在第一行之后迭代?我确定会发生这种情况,因为 Team 类型只有一个选项,但我不希望这妨碍它。

【问题讨论】:

    标签: python python-3.x csv export-to-csv


    【解决方案1】:

    我参考了答案,你必须转置结果并使用它。 参考下面的帖子,
    Python - Transposing a list (rows with different length) using numpy fails.

    我使用自然排序对整数进行排序,并在列表中附加空格以获得预期的结果。 对于较大的列表,自然排序较慢 你也可以使用第三方库,

    Does Python have a built in function for string natural sort?

    def natural_sort(l):
        convert = lambda text: int(text) if text.isdigit() else text.lower()
        alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]
        return sorted(l, key = alphanum_key)
    
    res = [[] for _ in range(max(len(sl) for sl in columns))]
    count = 0
    for sl in columns:
        sorted_sl = natural_sort(sl)
        for x, res_sl in zip(sorted_sl, res):
            res_sl.append(x)
    
    
    for result in res:
        if (count > 0 ):
            result.insert(0,'')
        count = count +1
    
    with open ("test.csv", 'w', newline='') as f:
        writer = csv.writer(f)
        writer.writerows(res)
    f.close()
    

    在打印到 csv 文件之前,应将列转换为列表 可以利用 writerows 方法打印多行 https://docs.python.org/2/library/csv.html -- 你可以在这里找到更多信息

    TEAM1,STRATEGY1,ATTRIBUTION1,TIME_FRAME1,DATE1,FILE_TYPE1
    ,STRATEGY2,Attribution3,TIME_FRAME2,FILE_TYPE2
    ,STRATEGY3,Attribution4,TIME_FRAME3
    ,STRATEGY4,Attribution5,TIME_FRAME4
    ,STRATEGY5,Attribution6,TIME_FRAME5
    ,STRATEGY6,Attribution7,TIME_FRAME6
    ,STRATEGY7,Attribution8,TIME_FRAME7
    ,STRATEGY8,Attribution9
    ,STRATEGY9,Attribution10
    ,STRATEGY10
    ,STRATEGY11
    ,STRATEGY12
    ,STRATEGY13
    ,STRATEGY14
    ,STRATEGY15
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-18
      • 2013-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 2021-12-12
      相关资源
      最近更新 更多