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がすでにキーとして存在するポイントを辞書に保存しようとしています。つまり、辞書に存在しない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を取り続けることができ、前の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 に答える