我需要将一些数据导入服务器。我遇到的问题是数据格式不正确。简单来说,它看起来像这样:
ITEMS_DIREC
ID | Co-ordinate
1 | 648
2 | 25
2 | 305
2 | 307
2 | 569
3 | 354
3 | 450
3 | 573
4 | 293
4 | 449
5 | 25
5 | 73
我希望它看起来像这样:
1 | 648
2 | 25, 305, 307, 569,
3 | 354, 450, 573,
4 | 293, 449
5 | 25, 73
这是我必须改变的代码(这段代码假定每个ID都是唯一的,所以没有像上面那样的倍数):
class Item:
def __init__(self, iid, name):
self.iid = iid
self.name = name
class Data:
def __str__(self):
return "Item[iid=%s,name=%s]" % (self.iid, self.name)
def __init__(self):
self._items = {}
self._items_file = "%s/%s" % (DATA_DIREC, ITEMS_DIREC)
def add_item(self, item):
self._items[item.iid] = item
def __init_items(self):
f = open(self._items_file, 'r')
for line in f:
data = line.rstrip('\r\n').split("|")
self.add_item(Item(data[0], data[1]))
f.close()
print "Items added" % len(self._items)
所以我得到的印象是,如果我在原始数据上使用此代码,则不会将多个ID视为同一个ID。不仅如此,但我的数据集非常大(100,000+)并且并非每个ID都具有相同数量的坐标,因此我不能简单地构造矩阵并填写值。
任何人都能在正确的方向上给我一些帮助吗?我对Python没有任何经验,所以我到目前为止所尝试的所有内容都失败了。
答案 0 :(得分:3)
您可以使用csv.reader
和csv.writer
来处理管道分隔数据,使用collections.defaultdict
来累积密钥ID的每个值。您可以使用islice
方便地跳过不需要的前几行,然后对于最终输出,按ID对行进行排序,然后将其写出,后跟逗号分隔的值列表。例如:
import csv
from itertools import islice
from collections import defaultdict
dd = defaultdict(list)
with open('input') as fin:
pipe_in = csv.reader(fin, delimiter='|')
for key, val in islice(pipe_in, 3, None):
dd[key].append(val)
with open('output', 'wb') as fout:
pipe_out = csv.writer(fout, delimiter='|')
pipe_out.writerows([k, ', '.join(v)] for k, v in sorted(dd.iteritems()))
# 1|648
# 2|25, 305, 307, 569
# 3|354, 450, 573
# 4|293, 449
# 5|25, 73