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

标签 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)

这是我对 list 的粗略估计:

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

任何人都可以帮助我理解如何迭代第一行吗?我确信这种情况正在发生,因为团队类型只有一个选项,但我不希望这阻碍它。

最佳答案

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

关于python - 使用 Zip 函数在 CSV 中创建数据长度不同的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54817576/

相关文章:

python - 如何在没有递归的情况下展平嵌套字典?

python - 将 .csv 数据重写到文件会在 python 中创建人工第一列

ios - 处理 CSV 文件

python - 当列名不同时如何将数据框附加到另一个数据框(具有相同的列大小)

python - 使用递归进行分形绘图

python - Tkinter 窗口直到循环完成后才更新

python - Vim 带圆括号和方括号的缩进级别

python - 替换为出现条件python

javascript - 动态文本抓取

powershell - 如何从数组中提取数据值并作为变量输入