使用Ruby在文件前面添加一行

MrD*_*ase 15 ruby file-io prepend

我想用Ruby添加一行到Ruby的文件顶部:

# initial file contents
something
else

# file contents after prepending "hello" on its own line
hello
something
else
Run Code Online (Sandbox Code Playgroud)

以下代码只是替换整个文件的内容:

f = File.new('myfile', 'w')
f.write "test string"
Run Code Online (Sandbox Code Playgroud)

the*_*Man 22

这是一项非常常见的任务:

original_file = './original_file'
new_file = original_file + '.new'
Run Code Online (Sandbox Code Playgroud)

设置测试:

File.open(original_file, 'w') do |fo|
  %w[something else].each { |w| fo.puts w }
end
Run Code Online (Sandbox Code Playgroud)

这是实际的代码:

File.open(new_file, 'w') do |fo|
  fo.puts 'hello'
  File.foreach(original_file) do |li|
    fo.puts li
  end
end
Run Code Online (Sandbox Code Playgroud)

将旧文件重命名为安全的文件:

File.rename(original_file, original_file + '.old')
File.rename(new_file, original_file)
Run Code Online (Sandbox Code Playgroud)

证明它有效:

puts `cat #{original_file}`
puts '---'
puts `cat #{original_file}.old`
Run Code Online (Sandbox Code Playgroud)

哪个输出:

hello
something
else
---
something
else
Run Code Online (Sandbox Code Playgroud)

您不想尝试将文件完全加载到内存中.这将一直有效,直到你得到一个比你的RAM分配更大的文件,并且机器会爬行,或者更糟糕的是,崩溃.

相反,逐行阅读.读取单个行仍然非常快,并且可扩展.您必须在驱动器上有足够的空间来存储原始文件和临时文件.


MrD*_*ase 7

fwiw这似乎有效:

#!usr/bin/ruby

f = File.open("myfile", "r+")
lines = f.readlines
f.close

lines = ["something\n"] + lines

output = File.new("myfile", "w")
lines.each { |line| output.write line }
output.close
Run Code Online (Sandbox Code Playgroud)

  • 小心啜饮文件.将整个文件读入内存不是可扩展的解决方案. (6认同)

小智 6

正如有些人所说,可能不要将它用于较大的文件,但这是一个简单的开始。

rd = IO.read 'myfile'
IO.write 'myfile', "hello\n" + rd
Run Code Online (Sandbox Code Playgroud)


Dav*_*dez 5

我想出了类似这样的东西,它比我见过的其他解决方案更具描述性,也更加隐晦:

def file_prepend(file, str)
  new_contents = ""
  File.open(file, 'r') do |fd|
    contents = fd.read
    new_contents = str << contents
  end
  # Overwrite file but now with prepended string on it
  File.open(file, 'w') do |fd| 
    fd.write(new_contents)
  end
end
Run Code Online (Sandbox Code Playgroud)

您可以像这样使用它:

file_prepend("target_file.txt", "hello world!\n")
Run Code Online (Sandbox Code Playgroud)