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