Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 像蟒蛇一样编码_Python - Fatal编程技术网

Python 像蟒蛇一样编码

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

我是一名专业的web开发人员,在业余时间通过MOOC学习python。我真的很喜欢它,并希望得到一些关于如何编写更多“pythonic”代码的提示

我基本上希望在一个csv中读取,该csv在nodeID和categoryName/ID之间具有一对多关系。输入文件将如下所示:

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数据

  • 您只需要写出节点ID和类别名称,因此您只需要从输入中收集这些信息


  • 这个问题可能更适合于:正如伯尼所说,最好问这样的问题:“它有效,但什么是更好的方法?”。但是如果你想知道一个好的方法来解决这个问题和类似的问题,我建议这个模块只是简单地介绍一下
    pandas
    解决方案:它基本上是
    df.groupby(“NODEID”)[“CATNAME”]。apply(“,”.join)
    ,在开始的时候是
    read_csv
    ,在结束的时候是
    to_csv
    ,就这样了。谢谢Martijn!并为在错误的论坛上发布这个问题道歉。没有必要道歉,布兰登。我们很高兴你得到了答案。请随意接受(单击复选标记)。