我有一个包含数百万点的文本文件( 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
答案 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行具有相同的键