如果你写:
source_file.each { |line|
File.open(output_file,"a+") { |f|
f.print ???
}
}
您将为从输出文件读取的每一行打开然后关闭输出文件。即使您只想读取一行输入,那也是错误的做法。
而是尝试以下方法之一:
File.open(output_file, 'a') do |fo|
File.open('path/to/input_file') do |fi|
fo.puts fi.readline[46..245]
end
end
这使用IO.readline
,它从文件中读取一行。之后该块落空,导致输入和输出文件都自动关闭。此外,它'a'
仅以附加模式打开输出文件。'a+'
除非您打算追加和阅读,否则这是错误的,这很少这样做。从文档中:
"a+" Read-write, starts at end of file if file exists,
otherwise creates a new file for reading and
writing
或者:
File.open(output_file, 'a') do |fo|
File.foreach('path/to/input_file') do |li|
fo.puts li[46..245]
break
end
end
foreach
当我们逐行读取文件时最常使用。它是以可扩展的方式读取文件的主要方式。它想要循环块内的文件,这就是为什么break
存在,以打破该循环。
或者:
File.foreach('path/to/input_file') do |li|
File.write(output_file, li[46..245], -1, :mode => 'a')
break
end
File.write
当您有一堆文本或二进制文件并希望将其写入一个块然后继续前进时,这很有用。-1
告诉 Ruby 移动到文件的末尾。:mode => 'a'
覆盖通常会截断现有文件的默认模式。