我是一名专业的网络开发人员,他在业余时间通过MOOC学习python。我真的很喜欢它,并且希望提供一些关于如何编写更多“pythonic”代码的技巧。
我基本上想读一个在nodeID和categoryName / ID之间有一对多关系的csv。输入文件将如下所示:
NODEID CATID CATNAME
3 4 Plastic
3 5 Sharks with Lasers
4 7 Widgets
我希望结果输出为:
NODEID CATNAME
3 Plastic, Sharks with Lasers
4 Widgets
我就是这样做的,但我知道这不是最有效的方式:
import csv # import the csv module
import sys # import the sys module
from collections import defaultdict
inputFile = open('term_data.csv', 'rb')
try:
reader = csv.reader(inputFile)
nodeDict = defaultdict(dict)
for row in reader:
colnum = 0
# nodeDict[nodeid][catid] = catname
nodeDict[row[0]][row[1]] = row[2]
finally:
inputFile.close()
f = open('terms.txt', 'w')
for node, nodeVals in nodeDict.items():
f.write(node + ';')
#sys.stdout.write(node + ';')
itera = 0
for cat, name in nodeVals.items():
f.write(name)
itera += 1
if (itera == len(nodeVals.items())):
f.write(';' + '\n')
else:
f.write(',')
非常感谢任何帮助或批评!
答案 0 :(得分:2)
我把它写成:
import csv
from collections import defaultdict
nodeDict = defaultdict(list)
with open('term_data.csv', 'rb') as inputFile:
reader = csv.reader(inputFile)
next(reader, None) # Skip header line in file.
for row in reader:
nodeDict[row[0].append(row[2])
with open('terms.txt', 'wb') as outputFile:
writer = csv.writer(outputFile)
writer.writerow(['NODEID', 'CATNAME'])
for node, names in nodeDict.iteritems():
writer.writerow([node] + names)
这会将名称写为单独的列。如果您需要它们在一列中,请先单独加入它们,csv.writer()
将引用它们以表明它们是一列:
for node, names in nodeDict.iteritems():
writer.writerow([node, ','.join(names)])
使用with
来管理文件生命周期;它们将以这种方式自动关闭,无论代码中发生什么。
使用csv
来编写输出,它仍然是CSV数据。
您只是在写出节点ID和类别名称,因此您需要从输入中收集所有内容。