【发布时间】:2012-06-08 03:41:12
【问题描述】:
我有一个 CSV 文件,我想将其转换为其他格式。 CSV格式如下:
A_to_B,B_to_C,C_to_D,...
0,2,1,...
即,每个标题由两个变量组成,例如A 和 B,文件中的每一行都包含一个值,即 0、1 或 2。我正在尝试编写一个 Python 脚本,该脚本将读取此 CSV 文件并将其转换为如下格式:
A,B,0
B,C,2
C,D,1
...
换句话说,它将包含标题的第一行拆分为变量(例如,A、B、C、D 等),然后匹配新格式的相应值。有谁知道如何做到这一点?我掌握了一些基础知识,但我无法正确理解实际的算法。感谢您的帮助。
更新 #1
这里有一些代码,但我没有得到正确的输出:
import csv,sys
reader = csv.reader(open(sys.argv[1], 'rt'), delimiter=',')
headers = reader.next()
data = []
for row in reader:
line = ','.join(row)
data.append(line)
for row in data:
for cols, val in zip(headers, row):
newRow = cols[0], cols[-1], val
print newRow
CSV 文件如下所示:
A,B,C
0,2,1
0,1,1
但是,代码的输出看起来像这样,所以我需要一种以正确方式迭代 CSV 文件的方法:
('A', 'A', '0')
('B', 'B', ',')
('C', 'C', '2')
('A', 'A', '0')
('B', 'B', ',')
('C', 'C', '1')
更新 #2
如果有人偶然发现了这一点,这是我最终得到的代码(没有错误处理或任何东西,但它有效):
#!/usr/bin/python
# -*- coding: utf-8 -*-
import csv,os,sys
reader = csv.reader(open(sys.argv[1], 'rt'), delimiter=',')
headers = reader.next()
i = 1
for row in reader:
os.system('rm id' + str(i) + '.csv')
os.system('cat ./seeds >> id' + str(i) + '.csv')
for srcdest,dist in zip(headers, row):
sd = srcdest.split('_to_')
src,dest = sd[0],sd[-1]
if dist == '0':
pass
else:
f = open('id' + str(i) + '.csv', 'a')
f.write('{},{},{}\n'.format(src.lower().replace('_',''),dest.lower().replace('_',''),float(dist)))
i=i+1
f.close()
感谢大家的帮助!
【问题讨论】:
-
您可以编辑帖子的格式吗?看起来你想要不同行的东西,但你的每个数据示例都显示为一行。这让你很难理解你想要什么输出格式。
-
已修复。谢谢你把它捡起来。 @BrenBarn