如何替换txt文件中的列?

时间:2018-06-20 21:05:26

标签: python arrays python-3.x numpy replace

我有一个txt文件,

k1=np.linspace(0,1,10)
k2=np.linspace(0,2,10)
k3=np.linspace(0,3,10)
k4=np.linspace(0,4,10)

np.savetxt('k.txt',np.transpose([k1,k2,k3,k4]))

现在我想将第二列(k2)替换为新数组

k5=np.linspace(0,5,10)

如何在不重复使用np.savetxt或循环的情况下有效地替换列?

3 个答案:

答案 0 :(得分:0)

不重写整个文件并不容易。文本文件是简单的,顺序的数据存储方法,无需固定的结构,索引或随机访问搜索。因此,您必须实现所有这些功能。

常见的方法是读取文件,对其进行编辑,然后以所需的方式用数据覆盖文件。

当文件太大而不能完全容纳在内存中时,另一种方法是创建一个新的临时文件,并在写入新文件的同时逐行读取旧文件。然后删除旧文件,然后将新文件重命名为与原始文件相同的名称。

如果您还需要更多,我建议您使用数据库。 sqlite包含在python中,并且可以非常快速地直接在文件中执行您请求的操作。

答案 1 :(得分:0)

def change(tuple):
    line, newk = tuple
    oldk = line.split()
    return "%s %.18e %s %s\n" % (oldk[0], newk, oldk[2], oldk[3])

filename = "k.txt" 
lines = fileinput.input(filename)
tuples = zip(lines, k5)
newlines = list(map(change, tuples))

fo = open(filename, "r+")
fo.writelines(newlines)

此处脚本创建了一个元组(行,k)列表,每行包含k的新值。

%.18e NumPy.savetext() 方法的默认格式,因此您需要使该格式适应用于创建源文件的格式。

答案 2 :(得分:-2)

您不需要循环。您可以使用readlines()将整个文件读入列表,修改列表的特定元素,然后使用writelines()将其写回到文件中。

with open("filename.txt", "r+") as f:
    lines = f.readlines()
    lines[2] = "k5=np.linspace(0,5,10)\n"
    f.seek(0)
    f.writelines(lines)
    f.truncate()

f.seek()返回到文件的开头,以便f.writelines()覆盖它。然后,如果替换的内容比原始文件的内容短,我们将使用f.truncate()删除所有多余的内容。

请不要忘记\n新内容中的lines[2]writelines()不会在参数中的字符串之间插入换行符。

相关问题