使用islice读取chunk-by-chunk的文本文件

时间:2013-03-25 19:19:20

标签: python coding-style slice

我有一个包含数百万点的文本文件( 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

其中 minx maxy 是网格的原点(左上角),大小是网格的大小。 float(point[0])float(point[1])是点-i的 x y

ID 是point-i放弃的位置。

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

使用这个字典我正在尝试阅读其余的点(约8百万)并在字典中存储 ID 已经显示为的点。换句话说,字典中不存在ID的点存储在新的文本文件中,否则 它们存储在字典中。

我正在尝试如何找出一个样式,每隔一百万个点切片直到文件结尾(未知)

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

1 个答案:

答案 0 :(得分: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行具有相同的键