使用Python进行分组和复选标记

使用Python进行分组和复选标记,python,csv,Python,Csv,我有几个文件,每个文件都有如下数据(文件名:内部数据由换行符分隔): 迈克:飞机 Paula:飞机\n牵引\n船\n飞机 比尔:船 斯科特:汽车 如何使用python创建一个csv文件,对所有不同的车辆进行分组,然后在适用的人身上加一个X,如: 下面是一个如何解析此类文件的示例 请注意,字典在这里是无序的。您可以使用标准库中的ordered dict(在Python 3.2/2.7的情况下),如果您有较旧的Python版本,可以查找任何可用的实现/后端口,或者只需在附加列表中保存一个顺序:) 下

我有几个文件,每个文件都有如下数据(文件名:内部数据由换行符分隔):

  • 迈克:飞机
  • Paula:飞机\n牵引\n船\n飞机
  • 比尔:船
  • 斯科特:汽车
  • 如何使用python创建一个csv文件,对所有不同的车辆进行分组,然后在适用的人身上加一个X,如:


    下面是一个如何解析此类文件的示例

    请注意,字典在这里是无序的。您可以使用标准库中的ordered dict(在Python 3.2/2.7的情况下),如果您有较旧的Python版本,可以查找任何可用的实现/后端口,或者只需在附加列表中保存一个顺序:)


    下面是一个如何解析此类文件的示例

    请注意,字典在这里是无序的。您可以使用标准库中的ordered dict(在Python 3.2/2.7的情况下),如果您有较旧的Python版本,可以查找任何可用的实现/后端口,或者只需在附加列表中保存一个顺序:)


    假设输入如下所示:

    Mike: Plane
    Car
    Paula: Plane
    Train
    Boat
    Car
    Bill: Boat
    Train
    Scott: Car
    
    此python脚本将车辆放置在字典中,由人员编制索引:

    #!/usr/bin/python
    
    persons={}
    vehicles=set()
    
    with open('input') as fd:
        for line in fd:
            line = line.strip()
            if ':' in line:
                tmp = line.split(':')
                p = tmp[0].strip()
                v = tmp[1].strip()
                persons[p]=[v]
                vehicles.add(v)
            else:
                persons[p].append(line)
                vehicles.add(line)
    
    for k,v in persons.iteritems():
        print k,v
    
    print 'vehicles', vehicles
    
    结果:

    Mike ['Plane', 'Car']
    Bill ['Boat', 'Train']
    Scott ['Car']
    Paula ['Plane', 'Train', 'Boat', 'Car']
    vehicles set(['Train', 'Car', 'Plane', 'Boat'])
    

    现在,所有需要的数据都放在数据结构中。csv部分留给读者作为练习:-)

    假设输入如下:

    Mike: Plane
    Car
    Paula: Plane
    Train
    Boat
    Car
    Bill: Boat
    Train
    Scott: Car
    
    此python脚本将车辆放置在字典中,由人员编制索引:

    #!/usr/bin/python
    
    persons={}
    vehicles=set()
    
    with open('input') as fd:
        for line in fd:
            line = line.strip()
            if ':' in line:
                tmp = line.split(':')
                p = tmp[0].strip()
                v = tmp[1].strip()
                persons[p]=[v]
                vehicles.add(v)
            else:
                persons[p].append(line)
                vehicles.add(line)
    
    for k,v in persons.iteritems():
        print k,v
    
    print 'vehicles', vehicles
    
    结果:

    Mike ['Plane', 'Car']
    Bill ['Boat', 'Train']
    Scott ['Car']
    Paula ['Plane', 'Train', 'Boat', 'Car']
    vehicles set(['Train', 'Car', 'Plane', 'Boat'])
    

    现在,所有需要的数据都放在数据结构中。csv部分留给读者作为练习:-)

    假设这些行号不在其中(如果在其中很容易修复),并使用如下输入文件:

    Mike: Plane
    Car
    Paula: Plane
    Train
    Boat
    Car
    Bill: Boat
    Train
    Scott: Car
    
    可在此处找到解决方案:


    这个脚本唯一没有做的事情就是保持列的顺序,以便名称在其中。可以保留一个单独的列表来维护顺序,因为地图/目录本质上是无序的。

    假设这些行号不在其中(如果在其中很容易修复),并使用如下输入文件:

    Mike: Plane
    Car
    Paula: Plane
    Train
    Boat
    Car
    Bill: Boat
    Train
    Scott: Car
    
    可在此处找到解决方案:


    这个脚本唯一没有做的事情就是保持列的顺序,以便名称在其中。可以保留一个单独的列表来维护顺序,因为地图/目录本身就是无序的。

    最优雅、最简单的方法是:

    vehiclesToPeople = {}
    people = []
    
    for root,dirs,files in os.walk('/path/to/folder/with/files'):
        for file in files:
            person = file
            people += [person]
            path = os.path.join(root, file)
    
            with open(path) as f:
                for vehicle in f:
                    vehiclesToPeople.setdefault(vehicle,set()).add(person)
    
    people.sort()
    table = [ ['']+people ]
    for vehicle,owners in peopleToVehicles.items():
        table.append([('X' if p in vehiclesToPeople[vehicle] else '') for p in people])
    
    csv = '\n'.join(','.join(row) for row in table)
    

    您也可以使用
    pprint.pprint(table)
    查看它。

    最优雅、最简单的方法是:

    vehiclesToPeople = {}
    people = []
    
    for root,dirs,files in os.walk('/path/to/folder/with/files'):
        for file in files:
            person = file
            people += [person]
            path = os.path.join(root, file)
    
            with open(path) as f:
                for vehicle in f:
                    vehiclesToPeople.setdefault(vehicle,set()).add(person)
    
    people.sort()
    table = [ ['']+people ]
    for vehicle,owners in peopleToVehicles.items():
        table.append([('X' if p in vehiclesToPeople[vehicle] else '') for p in people])
    
    csv = '\n'.join(','.join(row) for row in table)
    

    你也可以做
    pprint.pprint(table)
    来查看它。

    行号也在你的文件中吗?不,那只是为了表明有单独的文件。行号也在你的文件中吗?不,那只是为了表明有单独的文件。这很好,唯一的问题是,文件输出在每行后面生成一个换行符。嗯。。你不希望每一行都在它自己的行上吗?事实上,问题是我没有创建二进制的输出csv文件,正如我看到的那样。很高兴知道-考虑到文件是文本,以二进制模式打开文件非常不直观。这非常有效,唯一的问题是文件输出在每行之后生成一个换行符。嗯。。你不希望每一行都在它自己的行上吗?事实上,问题是我没有创建二进制的输出csv文件,正如我看到的那样。很高兴知道-考虑到文件是文本,以二进制模式打开文件非常不直观。