python - 在 csv 字典/嵌套 csv 字典的帮助下使用 Python 编写 CSV 文件
问题描述
我有一个 csv 文件,我想将它写入另一个 csv 文件。这比看起来要复杂一些。希望有人更正我的代码并重写它,以便我可以获得所需的 csvfile。我正在使用 python 2 和 3 两个版本。
mycsvfile:
id,field1,point_x,point_y,point_z
a1,x1,10,12,3
b1,x2,20,22,5
a2,x1,25,17,7
a1,x2,35,13,3
a1,x5,15,19,9
b1,x1,65,11,2
b2,x5,50,23,1
b2,x1,75,17,7
c1,x2,70,87,2
c2,x1,80,67,4
c3,x2,85,51,6
我的代码:
import os
import csv
import collections
from csv import DictWriter
with open(r'C:\Users\Desktop\kar_csv_test\workfiles\incsv.csv', 'r') as csvfile:
reader = csv.reader(csvfile, delimiter=',')
my_dict = collections.defaultdict(dict)
for row in reader:
my_dict[row[0]][row[1]] = [row[2],row[3],row[4]]
print (my_dict)
with open(r'C:\Users\Desktop\kar_csv_test\workfiles\outcsv.csv','w', newline='') as wf:
fieldnames = ['id', 'x1(point_x)', 'x1(point_y)', 'x1(point_z)', 'x2(point_x)', 'x2(point_y)', 'x2(point_z)'] # >>>>>>etc, till x20(point_x), x20(point_y), x20(point_z)
my_write = csv.DictWriter(wf, fieldnames = fieldnames, delimiter = ',')
my_write.writeheader()
Desired output as csv file:
id,x1(point_x),x1(point_y),x1(point_z),x2(point_x),x2(point_y),x2(point_z)
a1,10,12,3,35,13,3,
a2,25,17,7,,,,
b1,65,11,2,20,22,5,
b2,75,17,7,,,,
c1,,,,70,87,2,
c2,80,67,4,,,,
c3,,,,85,51,6,
解决方案
此答案仅适用于 Python3。csv 模块在 Python2 和 Python3 之间有一个非常不同的接口,编写兼容的代码超出了我准备在这里做的事情。
在这里,我将计算fieldnames
列表,并以相同的模式计算每一行:
...
with open(r'C:\Users\Desktop\kar_csv_test\workfiles\outcsv.csv','w', newline='') as wf:
fieldnames = ['id'] + ['x{}(point_{})'.format(i, j)
for i in range(1, 6) for j in "xyz"] # only up to x5 here
my_write = csv.DictWriter(wf, fieldnames = fieldnames, delimiter = ',')
my_write.writeheader()
for k, v in my_dict.items():
row = {'x{}(point_{})'.format(i, k):
v.get('x{}'.format(i), ('','',''))[j] # get allows to get a blank triple is absent
for i in range(1,6) for j,k in enumerate("xyz")}
row['id'] = k # do not forget the id...
my_write.writerow(row)
使用您的示例数据,它给出:
id,x1(point_x),x1(point_y),x1(point_z),x2(point_x),x2(point_y),x2(point_z),x3(point_x),x3(point_y),x3(point_z),x4(point_x),x4(point_y),x4(point_z),x5(point_x),x5(point_y),x5(point_z)
a1,10,12,3,35,13,3,,,,,,,15,19,9
b1,65,11,2,20,22,5,,,,,,,,,
a2,25,17,7,,,,,,,,,,,,
b2,75,17,7,,,,,,,,,,50,23,1
c1,,,,70,87,2,,,,,,,,,
c2,80,67,4,,,,,,,,,,,,
c3,,,,85,51,6,,,,,,,,,
推荐阅读
- intellij-idea - 如何通过操作访问自定义 ToolWindow 内的组件?
- r - 使用 if- else if - else 语句在 R 中生成附加变量
- sql - Knex.js PostgreSQL 列引用“created_at”不明确
- python - 您如何找到在每个月底重新开始的值的滚动最大值?熊猫蟒
- neo4j - 即使在安装插件后,Nepo4j 也无法使用 apoc 功能
- java - Java Iterator 正在跳过一半元素
- javascript - Angular 中的 Counter Up v2 插件(动画计数器)
- oracle - Oracle 访问 SQL 中的可变数组元素
- android - 使用 OR 运算符进行条件渲染
- azure - 可以使用 Powershell 导出 Azure 中的资源配置吗?