我有一个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
或循环的情况下有效地替换列?
答案 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()
不会在参数中的字符串之间插入换行符。