如何在 julia 中编辑文件的一行?

Luf*_*ufu 3 io file julia

我可以读取文件并根据这样的谓词找到特殊行

open(file, read=true, write=true, append=true) do io
    for line in eachline(io)
        if predicate(line)
            new_line = modifier(line)
            # how to replace the line with new_line in the file now?
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

但现在如何更改文件中的内容呢?

kev*_*ham 5

一般来说,您无法就地修改文件(对于 Julia 以外的语言也是如此),因为添加或删除字符会改变后面所有内容的位置(文件只是一长串字节)。

所以你可以

  1. 读入整个文件,更改您想要更改的内容,然后将整个文件写入同一位置
  2. 逐行读取,写入新位置,然后将新文件复制到旧位置

如果您有非常大的文件,后者可能会更好(因此您不必将整个文件存储在内存中)。您已经获得了大部分代码,只需创建一个临时文件,然后最后复制回原始路径即可。就像是:

(tmppath, tmpio) = mktemp()
open(file) do io
    for line in eachline(io, keep=true) # keep so the new line isn't chomped
        if predicate(line)
            line = modifier(line)
        end
        write(tmpio, line)
    end
end
close(tmpio)
mv(tmppath, file, force=true)
Run Code Online (Sandbox Code Playgroud)

注意:如果这是在全局范围内(例如,不在函数内部),您可能必须将其放在块内部的global前面。或者,将整个内容包装在. 看这里tmpiodolet

  • 这需要 `mv(tmppath, file, force = true)` 因为 `file` 已经存在。 (2认同)
  • 和“mv”之前的“close(tmpio)” (2认同)