CSV写入将行拆分为多列

2024-06-16 18:58:53 发布

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

抱歉,如果这个问题是重复的,但我搜索,找不到一个简单的例子。你知道吗

我正在尝试将字典值写入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   |
|---------|---------|---------|---------|

Tags: 文件csvkey代码log字典zcval
1条回答
网友
1楼 · 发布于 2024-06-16 18:58:53

编辑

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

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,以避免在for循环中过多的len()函数调用,这会在一定程度上阻碍效率。你知道吗

我们还在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。你知道吗

相关问题 更多 >