使用Zip函数在CSV中创建长度不同的列

时间:2019-02-21 23:01:01

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

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

文件名的每个部分均以“ _”分隔,与该文件的详细分类有关。

命名对流看起来像这样:

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文件中。

有人可以帮助我了解如何在第一行之后进行迭代吗?我敢肯定,这是因为“团队”类型只有一个选项,但是我不希望这会阻碍它。

1 个答案:

答案 0 :(得分:2)

我提到了答案,您必须转置结果并使用它。 请参阅下面的帖子,
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