python读取一个文件,为每行保存一个新列,并保存相同的文件

python读取一个文件,为每行保存一个新列,并保存相同的文件,python,performance,save,overwrite,Python,Performance,Save,Overwrite,我有一个x,y,z值的文件。我希望找到一种优雅的方式来打开并向每一行添加一个新的值id,然后再次保存同一个文件 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) 前 身份证将是 get_point_grid_id(1,1,0,10,1,1) (9, 1) ge

我有一个x,y,z值的文件。我希望找到一种优雅的方式来打开并向每一行添加一个新的值id,然后再次保存同一个文件

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)

身份证将是

get_point_grid_id(1,1,0,10,1,1)
(9, 1)
get_point_grid_id(2,2,0,10,1,1)
(8, 2)
get_point_grid_id(3,3,0,10,1,1)
(7, 3)
新文件将被删除

1 1 10 (9, 1)
2 2 10 (8, 2)
3 3 10 (7, 3)
我正在阅读几种方法,并测试了几种方法。我老实说,我尝试过保存新文件,但失败了

我试过下面的解决办法

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),0,10,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

您可以通过该模块模拟所需的行为,但请记住,它将在后台创建原始10GB+文件的备份副本:

#! /usr/bin/env python
import fileinput

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)

input_file = "test.dat"
#
# Add mode='rb' to the arguments of fileinput.input() if you are
# using a binary file on operating systems that differentiate 
# between binary and text files (e.g. Microsoft Windows). 
#
for line in fileinput.input(input_file, inplace=True):
    columns = line.split()
    if 3 == len(columns):
        x, y, z = columns
        id = get_point_grid_id(float(x),float(y),0,10,1,1)
        print "{0} {1} {2} {3}".format(x, y, z, id)

inplace
参数传递到
fileinput.input
触发魔法。

写入一个单独的文件,然后重新命名!是的,这是一个解决方案,但文件已经很大(超过10GB)亲爱的@SudiptaChatterjee谢谢,但我正在寻找一个保存编码的解决方案。我确信有一种方法可以在pythonDue中逐行打开和替换,以适应当今存储设备的顺序性,在文件中间插入一个字节意味着剩余的数据将需要移动一个字节。我不确定今天是否有任何文件系统支持这一点。我能想到的最好的三个备选方案是:(1)使用更新的数据创建一个新文件,并在最后对其重命名,(2)将数据保存在数据库中,例如,并让数据库库负责更新字段,(3)以支持对数据集进行就地更新的结构化格式保存数据(HDF5可能适用于此).input(…inplace=True)是我处理它的方式+1dear@crayzeewulf和Jon感谢您的支持。我正在使用另一种解决方案(逐行),但我收到一条错误消息(请参见上面的更新):)我还意识到您正在将更新的数据写入同一个文件对象(
f
)。这不会做你认为它应该做的事情(正如新页面上的一些评论所指出的)。我认为您希望它更新当前行并保持文件的其余部分不变,但实际上它将覆盖文件中的部分数据。你应该尝试使用我上面列出的代码。Gianni,你可能并不孤单。
print
语句实际写入
input\u文件的事实并不明显,但根据文档,这是正确的行为。@crayzeewulf我使用fileinput.input(input\u file,inplace=True,mode=“rb”):在这种情况下,我只有第110(9,1)行。此外,使用“sys.stdout.write(newelement)”可以保存而不是“print”
'481499.55 6244324.75 19.15 (377, 2909)\n' 
#! /usr/bin/env python
import fileinput

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)

input_file = "test.dat"
#
# Add mode='rb' to the arguments of fileinput.input() if you are
# using a binary file on operating systems that differentiate 
# between binary and text files (e.g. Microsoft Windows). 
#
for line in fileinput.input(input_file, inplace=True):
    columns = line.split()
    if 3 == len(columns):
        x, y, z = columns
        id = get_point_grid_id(float(x),float(y),0,10,1,1)
        print "{0} {1} {2} {3}".format(x, y, z, id)