0

我有一个包含数百万个点的文本文件(x、*y*、z等)。我正在尝试用islice读取前一百万行以初始化字典

from collections import defaultdict
from itertools import islice

def point_grid_id(x, y, minx, maxy, size):
    """give id (row,col)"""
    col = int((x - minx) / size)
    row = int((maxy - y) / size)
    return row, col

def initialize_dict(filename, minx, maxy, size, chunk=1000000):
    point_dict = defaultdict(list)
    with open(filename, 'r') as datafile:
        for line in islice(datafile, chunk):
            point = line.rstrip().split(parse)
            point_dict[point_grid_id(float(point[0]), float(point[1]), minx, maxy, size)].append(point)
    return point_dict

其中minxmaxy是网格的原点(左上角)和网格的大小。,float(point[0])是点 ifloat(point[1])xy

ID是 point-i 放置的位置。

point_dict = initialize_dict(filename, minx, maxy, 2)

使用这本字典,我试图读取其余的点(约 800 万)并将ID已经作为Keys存在的点存储在字典中。换句话说,ID 不存在于字典中的点将存储在新的文本文件中,否则将它们存储在字典中。

我正在尝试如何找出每 100 万个点切片的样式,直到文件结束(未知)

size = 2
with open(filename, 'r') as datafile:
    for line in islice(datafile, 1000000, 2000000):
        point = line.rstrip().split(parse)
        if point_grid_id(float(point[0]), float(point[1]), minx, maxy, size) in point_dict:
            point_dict[point_grid_id(float(point[0]), float(point[1]), minx, maxy, size)].append(point)
        else:
            pass

使用这种形式,我总是得到拳头 10 分

with open(filename, 'r') as datafile:
    for line in islice(datafile, 10):
        point = line.rstrip().split(";")
        print point
4

1 回答 1

2

你可以继续取islice(datafile, 1000000)每个islice,从前一个停止的地方继续。问题是检测文件的结尾,你只会得到空的islices。

更好的模式是使用groupby

from itertools import groupby, count
with open(filename, 'r') as datafile:
    groups = groupby(datafile, key=lambda k, line=count(): next(line)//1000000)
    for k, group in groups:
        for line in group:
            ... 

分组的键是行号 //1000000 所以每组 1000000 行有相同的键

于 2013-03-25T19:27:42.957 回答