-1

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

任何帮助或批评将不胜感激!

4

1 回答 1

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 和类别名称,这就是您需要从输入中收集的全部内容。

于 2013-04-30T18:20:59.883 回答