我有几个文件,每个文件都有这样的数据(文件名:内部数据以换行符分隔):
- 迈克:飞机\n汽车
- 宝拉:飞机\n火车\n船\n汽车
- 比尔:船\n火车
- 斯科特:汽车
如何使用 python 创建一个 csv 文件,将所有不同的车辆分组,然后在适用的人员上打上 X,例如:
假设这些行号不在那里(如果有的话很容易修复),并且输入文件如下:
Mike: Plane
Car
Paula: Plane
Train
Boat
Car
Bill: Boat
Train
Scott: Car
可以在这里找到解决方案:https://gist.github.com/999481
import sys
from collections import defaultdict
import csv
# see http://stackoverflow.com/questions/6180609/group-and-check-mark-using-python
def main():
# files = ["group.txt"]
files = sys.argv[1:]
if len(files) < 1:
print "usage: ./python_checkmark.py file1 [file2 ... filen]"
name_map = defaultdict(set)
for f in files:
file_handle = open(f, "r")
process_file(file_handle, name_map)
file_handle.close()
print_csv(sys.stdout, name_map)
def process_file(input_file, name_map):
cur_name = ""
for line in input_file:
if ":" in line:
cur_name, item = [x.strip() for x in line.split(":")]
else:
item = line.strip()
name_map[cur_name].add(item)
def print_csv(output_file, name_map):
names = name_map.keys()
items = set([])
for item_set in name_map.values():
items = items.union(item_set)
writer = csv.writer(output_file, quoting=csv.QUOTE_MINIMAL)
writer.writerow( [""] + names )
for item in sorted(items):
row_contents = map(lambda name:"X" if item in name_map[name] else "", names)
row = [item] + row_contents
writer.writerow( row )
if __name__ == '__main__':
main()
输出:
,Mike,Bill,Scott,Paula
Boat,,X,,X
Car,X,,X,X
Plane,X,,,X
Train,,X,,X
这个脚本唯一不做的就是保持列的顺序与名称所在的顺序一致。可以保留一个单独的列表来维护顺序,因为 map /字典本质上是无序的。
我是一名优秀的程序员,十分优秀!