CSV编写-将行分成多列

时间:2019-10-02 19:37:58

标签: python csv

很抱歉,如果重复此问题,但我进行了搜索,找不到一个简单的例子。

我正在尝试将字典值写入csv文件。这是python代码:

w = csv.writer(open("../log.csv", "w"))
alphanum = {'A':1, 'B':2, 'C':3, 'D':4, 'ZA':27, 'ZB':28, 'ZC':29, 'ZD':30}
for key, val in sorted (alphanum.items()):
  w.writerow([key, val])

以下是csv文件中的输出:

|---------|---------|
|    A    |     1   |
|    B    |     2   |
|    C    |     3   |
|    D    |     4   |
|    ZA   |     27  |
|    ZB   |     28  |
|    ZC   |     29  |
|    ZD   |     30  |
|---------|---------|

但是我想拆分行并以以下格式编写:

|---------|---------|---------|---------|
|    A    |    1    |    ZA   |    27   |
|    B    |    2    |    ZB   |    28   |
|    C    |    3    |    ZC   |    29   |
|    D    |    4    |    ZD   |    30   |
|---------|---------|---------|---------|

1 个答案:

答案 0 :(得分:1)

编辑

在进一步澄清之后,这是您正在寻找的解决方案:

import csv

w = csv.writer(open("../log.csv", "w"))
alphanum = {'A':1, 'B':2, 'C':3, 'D':4, 'ZA':27, 'ZB':28, 'ZC':29, 'ZD':30}
alphanum_size = len(alphanum)  
sorted_alphanum = sorted(alphanum.items())
for i in range(int(alphanum_size / 2)):
    w.writerow(sorted_alphanum[i] + sorted_alphanum[i + 4]) if i + 4 < alphanum_size else w.writerow(sorted_alphanum[i])
# Corner case - size is odd and len != 0, write last k: v pair
if alphanum_size % 2 and alphanum_size:  
    w.writerow(sorted_alphanum[-1])

如您所见,我们正在将字典的大小分配给变量alphanum_size,以避免len()循环中过多的for函数调用,这会在一定程度上影响效率。 / p>

我们还在for循环中使用了ternary operator。等效于:

if i + 4 < alphanum_size:
    w.writerow(sorted_alphanum[i] + sorted_alphanum[i + 4])
else:
    w.writerow(sorted_alphanum[i]

最简单的方法是更改​​数据容器,并将其基本上变成listdict中的一个。

w = open("../log.csv", "w")
alphanum = [{'col1': 'A', 'col2': 1, 'col3': 'ZA', 'col4': 27},
            {'col1': 'B', 'col2': 2, 'col3': 'ZB', 'col4': 28},
            ...]

然后,您可以使用DictWriter轻松地执行写操作。

header_columns = alphanum[0].keys()
writer = csv.DictWriter(w, header_columns)
writer.writeheader()
writer.writerows(alphanum)

这里可以做的另一项改进是使用上下文管理器而不是常规文件open()。您可以阅读那些here