像Pythonista一样编码

时间:2013-04-30 18:16:37

标签: python

我是一名专业的网络开发人员,他在业余时间通过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(',')

非常感谢任何帮助或批评!

1 个答案:

答案 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)])
  1. 使用with来管理文件生命周期;它们将以这种方式自动关闭,无论代码中发生什么。

  2. 使用csv来编写输出,它仍然是CSV数据。

  3. 您只是在写出节点ID和类别名称,因此您需要从输入中收集所有内容。