【问题标题】:How to replace a column in a txt file?如何替换txt文件中的一列?
【发布时间】:2018-11-30 02:32:39
【问题描述】:

我有一个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或循环的情况下有效地替换列?

【问题讨论】:

  • 当你说“列”时,你真的是指“行”吗?
  • 我不确定我是否理解这个问题。您是在询问 numpy 数组,还是如何使用 Python 来编辑脚本本身?
  • 所以您希望将文件中的第二列替换为k5
  • @Barmar 我转置了数组,然后它变成了列。
  • @user3483203 正确。

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


【解决方案1】:
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)

这里脚本创建了一个元组列表(line, k),其中每行包含 k 的新值。

%.18eNumPy.savetext() 方法的默认格式,因此您需要将格式调整为与用于创建源文件的格式相同。

【讨论】:

    【解决方案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() 删除任何多余的内容,如果替换比原始文件内容短。

    不要忘记lines[2] 的新内容中的\nwritelines() 不会在其参数中的字符串之间添加换行符。

    【讨论】:

      【解决方案3】:

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

      常见的方法是读取文件、编辑文件,然后以您想要的方式用数据覆盖文件。

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

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

      【讨论】:

      • 这是一个简单的例子,我的原始文件要复杂得多。起初我考虑了重新打开,重新编辑然后重写文件的方法,但我只是想知道是否有一种简单的方法来替换特定的列。
      • @kinderchan 正如我在回答中所说,,您不能轻易替换/删除顺序文件的一部分,因为它是顺序的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2020-09-12
      • 2022-01-19
      相关资源
      最近更新 更多