Python 像蟒蛇一样编码
我是一名专业的web开发人员,在业余时间通过MOOC学习python。我真的很喜欢它,并希望得到一些关于如何编写更多“pythonic”代码的提示 我基本上希望在一个csv中读取,该csv在nodeID和categoryName/ID之间具有一对多关系。输入文件将如下所示:Python 像蟒蛇一样编码,python,Python,我是一名专业的web开发人员,在业余时间通过MOOC学习python。我真的很喜欢它,并希望得到一些关于如何编写更多“pythonic”代码的提示 我基本上希望在一个csv中读取,该csv在nodeID和categoryName/ID之间具有一对多关系。输入文件将如下所示: NODEID CATID CATNAME 3 4 Plastic 3 5 Sharks with Lasers 4 7 Widgets
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(',')
任何帮助或批评都将不胜感激 我可以这样写:
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)])
和
来管理文件生命周期;无论代码中发生了什么,它们都将以这种方式自动关闭csv
也写入输出,它仍然是csv数据这个问题可能更适合于:正如伯尼所说,最好问这样的问题:“它有效,但什么是更好的方法?”。但是如果你想知道一个好的方法来解决这个问题和类似的问题,我建议这个模块只是简单地介绍一下
pandas
解决方案:它基本上是df.groupby(“NODEID”)[“CATNAME”]。apply(“,”.join)
,在开始的时候是read_csv
,在结束的时候是to_csv
,就这样了。谢谢Martijn!并为在错误的论坛上发布这个问题道歉。没有必要道歉,布兰登。我们很高兴你得到了答案。请随意接受(单击复选标记)。