如何在Ruby中向文件写入数据?

5

有许多关于这个问题的stackoverflow答案,比如《如何在Ruby中写入文件?》,但我在

我的文件结构如下:

├── test.txt
├── write_to_file.rb

“write_to_file.rb”文件的内容如下:

 File.open('test.txt', 'w') { |file| file.write('hello') }
 # tried ('./test.txt','w') ..as well.

我该如何从另一个write_to_file.rb文件向test.txt文件写入内容?
2个回答

4

正确的方式:

file = File.join(File.dirname(__FILE__), 'test.txt')
File.open(file, 'w') { |f| f.puts 'hello' }

__FILE__是包含上述代码的文件路径,因为你的test.txtwrite_to_file.rb在同一个目录中,所以这应该可以工作,无论你在哪个目录下,在你的机器上。

此外,请注意,我使用了puts方法而不是write,因为我喜欢换行。 :)


你的代码有什么问题(可能):

当你使用test.txt时,路径是相对于你运行write_to_file.rb脚本的目录的。例如,如果你从你的主目录运行write_to_file.rb,那么test.txt将意味着~/test.txt


Stoic. 你选择 puts 只是因为 \n 吗?还是有其他原因?我的意思不是 write 而是 puts。谢谢。 - user2107733
不妨介绍一下 File.write - Marc-André Lafortune

1

编写内容的简单方法是:

content = 'stuff to write'
File.write('text.txt', content)

这将用新内容覆盖文件。

一种更复杂的方式,可以更好地控制文件内容(无论是文本还是二进制),就是使用:

File.open('text.txt', 'w') do |fo|
  fo.write(content)
end

这也可以实现相同的功能。文件模式w告诉Ruby进行写操作。wb会告诉Ruby进行二进制内容写入。区别在于在写入文件时如何处理/翻译行尾。与许多其他语言一样,Ruby知道Windows期望不同于*nix系统的行尾,并在写文本时进行相应调整。使用“二进制”模式不会进行行尾翻译。
在块内,fo变量是一个文件句柄,因此您可以使用它以及writeprintputs将内容发送到文件中。它们的行为略有不同,但总体上,对于您的目的,它们将执行相同的操作。
使用open块告诉Ruby在块退出时关闭文件。始终尽可能短地打开和关闭文件。操作系统可用的文件句柄数量有限,保持它们处于打开状态可能会不必要地使用它们,因此其他应用程序无法使用它们。
您需要了解操作系统如何指定资源/文件的路径。

'text.txt''./text.txt'相同,这意味着它在当前目录中。

使用'../text.txt'表示它在上一级目录,'..'表示相对路径。同样,'subdir/text.txt'意味着"text.txt"在子目录中。

使用'/path/to/text.txt'表示它是一个绝对路径,从磁盘的根目录开始,您需要查看'path'文件夹,然后进入其'to'子文件夹,就可以在那里找到"text.txt"。

这些都在IO类文档中有详细介绍。(还有,在你问之前,File继承自IO,所以在File类中自动拥有IO中可用的所有内容。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接