2015-05-29 32 views
0

我有一个csv文件。第一列是user_id。如何根据Python中csv文件中第一列的值分隔行

例如:

User_ID Latitude Longitude 
1 55.75672775 37.61538506 
1 55.75286376 37.62190819 
1 47.60760975 -122.334137 
1 40.74881754 -73.99116039 
2 40.72046126 -74.00974274 
2 41.56305944 -70.65380573 
2 41.56302733 -70.65389156 
2 41.5542606 -70.60093403 
2 44.55035619 -69.63040352 

我要运行一些功能,为每一个独特的用户。说,记录用户拥有的所有位置。 所以我想要做的事,如:

For each user_id: 
    For row in all the rows of this user: 
     Do something 
     print user_id, result_output    

我不知道如何实现这一点。

任何人都可以帮助我吗?

+0

使用['csv'(https://docs.python.org/2/library/csv.html)模块 – styvane

+0

不要忘记标记答案是正确的,以便将来阅读此内容的人将知道哪些内容有效! – Scironic

回答

1

使用CSV模块的结果合并在DictReader,然后播放:

import csv 

data = {} 

with open('filepath', 'r') as input: 
    reader = csv.DictReader(input) 

    for row in reader: 
     try: 
      data[row['user_id']].append((row['Latitude'], row['Longitude'])) 
     Except KeyError: 
      data[row['User_ID'] = [(row['Latitude'], row['Longitude'])] 

for user_id in data: 
    # do stuff with your tuples of longs and lats for each user_id 

DictReader需要你的第一行,并将其作为每列的密钥。

使用这个,我们可以用你的用户id和一个列表作为一个值来创建一个字典。从那里你每次遇到user_id时,你只需要在用户列表中追加一个长整数和一列的元组。

如果您的分隔符不是逗号,请将delimter参数添加到DictReader。例如:

reader = DictReader(file, delimiter='\t') 

并确保您使用的密钥是什么的Python发现在头(可能有多余的空格,大小写等差异)

0

也许这样的事情(假设你的CSV是制表符分隔)

import csv 
import itertools 

with open('users.csv') as f: 
    reader = csv.DictReader(f, delimiter='\t') 

    userdict = {} 
    for line in reader: 
     uid = int(line['User_ID']) 
     if uid not in userdict: 
      userdict[uid] = [] 
     userdict[uid].append({k: float(v) for k,v in line.iteritems() if k != 'User_ID'}) 

    for k, v in userdict.iteritems(): 
     print 'User %d has been to' % k 
     for loc in v: 
      print 'lat=%f long=%f' % (loc['Latitude'], loc['Longitude']) 

第一部分产生由所述用户ID(转换为int键控dict),值是所有用于该用户(转换为浮点数)的纬度/经度对的列表。

的字典看起来像

{1: [{'Latitude': 55.75672775, 'Longitude': 37.61538506}, {'Latitude': 55.75286376, 'Longitude': 37.62190819}, {'Latitude': 47.60760975, 'Longitude': -122.334137}, {'Latitude': 40.74881754, 'Longitude': -73.99116039}], 2: [{'Latitude': 40.72046126, 'Longitude': -74.00974274}, {'Latitude': 41.56305944, 'Longitude': -70.65380573}, {'Latitude': 41.56302733, 'Longitude': -70.65389156}, {'Latitude': 41.5542606, 'Longitude': -70.60093403}, {'Latitude': 44.55035619, 'Longitude': -69.63040352}]} 

其使用所创建的字典,打印所有每个用户已经向坐标的第二部分。所以,你得到的输出喜欢

User 1 has been to 
lat=55.756728 long=37.615385 
lat=55.752864 long=37.621908 
lat=47.607610 long=-122.334137 
lat=40.748818 long=-73.991160 
User 2 has been to 
lat=40.720461 long=-74.009743 
lat=41.563059 long=-70.653806 
lat=41.563027 long=-70.653892 
lat=41.554261 long=-70.600934 
lat=44.550356 long=-69.630404 

你可以使用的字典由具有由元组所代表的纬度,经度对可能保存。

元组版(带defaultdict开机!)

import csv 
import itertools 
import collections 

with open('users.csv') as f: 
    reader = csv.DictReader(f, delimiter='\t') 

    userdict = collections.defaultdict(list) 
    for line in reader: 
     userdict[int(line['User_ID'])].append((float(line['Latitude']), float(line['Longitude']))) 

    for k, v in userdict.iteritems(): 
     print 'User %d has been to' % k 
     for loc in v: 
      print 'Lat=%f Long=%f' % loc 
0

由于要遍历用户ID,您将需要知道他们是提前—什么,这将需要阅读整个提前一次提交文件:

要查找特定用户标识的所有行,您需要再次读取整个文件以将其全部取出。这也意味着你需要多次这样做,每个唯一的用户ID一次。确保文件已打开并在每次迭代中正确关闭文件。下面的with声明确保发生这种情况。

在这里你去(假设你的csv文件是制表符分隔):

import csv 
from collections import defaultdict 

filename = 'user_data.csv' 

with open(filename, 'rb') as user_data: 
    reader = csv.reader(user_data, delimiter='\t') 
    next(reader) # skip header 
    user_ids = set(row[0] for row in reader) 

for user_id in sorted(user_ids): 
    with open(filename, 'rb') as user_data: 
     reader = csv.reader(user_data, delimiter='\t') 
     next(reader) # skip header 
     for row in (row for row in reader if row[0] == user_id): 
      pass # do something 
相关问题