python读取文件,每行保存一个新列广告保存同一个文件

Posted

技术标签:

【中文标题】python读取文件,每行保存一个新列广告保存同一个文件【英文标题】:python read a file, save a new column for each line ad save the same file 【发布时间】:2013-02-08 10:00:02 【问题描述】:

我有一个包含 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)

1 1 10
2 2 10
3 3 10

id 将是

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

newelement(真实数据)在哪里

'481499.55 6244324.75 19.15 (377, 2909)\n' 

【问题讨论】:

写入单独的文件,然后重命名! 是的,但文件已经很大(超过 10 GB) 亲爱的@SudiptaChatterjee 谢谢,但我正在寻找一个保存编码的解决方案。我确信有一种方法可以在 python 中逐行打开和替换 由于当今存储设备的顺序特性,在文件中间插入一个字节意味着剩余的数据需要移动一个字节。我不确定今天是否有任何文件系统支持这一点。我能想到的最好的三个替代方案是:(1)使用更新的数据创建一个新文件并在最后重命名它,(2)将数据保存在数据库中,例如SQLite 并让数据库库负责更新字段,(3) 以支持数据集就地更新的结构化格式保存数据(HDF5 可能适用于此)。 【参考方案1】:

您可以通过 fileinput 模块模拟所需的行为,但请记住,它会在后台创建原始 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)

传递给fileinput.inputinplace 参数触发了魔法。

【讨论】:

使用带有fileinput.input(...inplace=True)的东西是我接近它的方式+1 亲爱的@crayzeewulf 和 Jon 感谢您的支持。我正在使用其他解决方案(逐行),但我收到一条错误消息(请参阅上面的更新) :) 我也刚刚意识到您正在将更新的数据写入同一个文件对象 (f)。这不会做你认为应该做的事情(正如新页面上的几个 cmets 所指出的那样)。我认为您期望它更新当前行并使文件的其余部分保持不变,但实际上它会覆盖文件中的部分数据。你应该尝试使用我上面列出的代码。 詹尼,你可能并不孤单。 print 语句实际上写入 input_file 的事实并不明显,但根据文档,这是正确的行为。 @crayzeewulf 我使用 fileinput.input(input_file, inplace=True, mode="rb") 修复了此行为:在这种情况下,我只有第 1 1 10 (9, 1) 行。此外,使用“sys.stdout.write(newelement)”您可以保存而不是“打印”

以上是关于python读取文件,每行保存一个新列广告保存同一个文件的主要内容,如果未能解决你的问题,请参考以下文章

将字典保存为 Python 脚本

Python创建保存按钮,将编辑的版本保存到同一个文件(不另存为)

lua保存缓存中文件

python-文件读写

Python Numpy中数据的常用的保存与读取方法

在python中保存和读取文件中的数据? [复制]