【发布时间】:2013-02-08 14:38:04
【问题描述】:
我有以下问题。我正在读取文件 x,y,z 为:
481492.93 6244326.24 26.56
481493.03 6244325.60 25.06
481493.17 6244324.68 22.89
481493.50 6244322.52 17.80
481492.84 6244327.05 27.84
481492.90 6244326.66 26.90
481492.86 6244327.16 27.45
481493.48 6244323.08 17.79
481492.80 6244327.80 28.30
481492.94 6244326.84 26.04
..........................
我希望读取、修改和写入同一个文件(不创建备份文件,因为原始文件超过 10GB)
481492.93 6244326.24 26.56 (375, 2902)
481493.03 6244325.60 25.06 (376, 2902)
481493.17 6244324.68 22.89 (377, 2902)
481493.50 6244322.52 17.80 (379, 2903)
481492.84 6244327.05 27.84 (375, 2902)
481492.90 6244326.66 26.90 (375, 2902)
481492.86 6244327.16 27.45 (374, 2902)
481493.48 6244323.08 17.79 (379, 2903)
481492.80 6244327.80 28.30 (374, 2902)
481492.94 6244326.84 26.04 (375, 2902)
..........................
我写了以下方法
def get_point_grid_id(x,y,x_min,y_max,x_dist,y_dist):
col = int((x - x_min)/x_dist)
row = int((y_max - y)/y_dist)
return (row, col)
with open(file_temp, "r+") as f:
for line in open(file_temp):
x,y,z = line.split()
id = get_point_grid_id(float(x),float(y),origin[0],origin[1],1,1)
element = [x,y,z,id]
newelement = " ".join([str(e) for e in element])+ "\n"
f.write(newelement)
当我运行该函数时,我得到了以下错误
Traceback (most recent call last):
File "<editor selection>", line 3, in <module>
ValueError: too many values to unpack
我想是原始文件的连接问题
出现错误
>>> x,y,z = line.split()
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
ValueError: too many values to unpack
line 很奇怪的地方
'481499.82 6244470.31 29.23 (231, 2909)\n'
而不是'481499.82 6244470.31 29.23\n'
在for line in open(file_temp): 之后使用print line 我从新文件运行后得到了这个打印
481499.98 6244494.02 34.14
481499.98 6244494.02 34.14 (208, 2909)
481499.96 6244471.05 33.39
481499.96 6244471.05 33.39 (231, 2909)
481499.95 6244471.27 33.46
481499.95 6244471.27 33.46 (230, 2909)
481499.98 6244473.84 32.72
481499.98 6244473.84 32.72 (228, 2909)
481499.98 6244474.07 32.70
481499.98 6244474.07 32.70 (228, 2909)
481499.97 6244474.28 32.93
481499.97 6244474.28 32.93 (227, 2909)
481499.88 6244474.40 34.35
481499.88 6244474.40 34.35 (227, 2909)
【问题讨论】:
-
在执行
x,y,z=line.split()之前尝试执行print line。看起来您可能正在覆盖文件的某些部分。 -
这行不通(同时读取和写入),因为您正在写出的行比您正在读入的行长。那是身体不适合;您将用覆盖的数据超越您的读取操作。
-
with open(file_temp, "r+") as f:将对您的文件对象的引用分配给 f。For line in f:应该跟随而不是再次打开文件。 -
@Gianni:你必须这样做。
-
@EricRoper:我很乐意看到你尝试;输入行比写出的行短,因此每个新行都需要比原来的空间更多的空间。您必须先将整个文件读入内存,然后才能重写文件,并且使用 10GB 的输入文件是行不通的。
标签: python debugging error-handling streamwriter