Ruby读取行读取的不同文件大小

时间:2009-03-09 10:32:30

标签: ruby file-read

我需要做一些文件大小至关重要的事情。这产生了奇怪的结果

filename = "testThis.txt"
total_chars = 0
file = File.new(filename, "r")
file_for_writing = nil
while (line = file.gets)
  total_chars += line.length
end
puts "original size #{File.size(filename)}"
puts "Totals #{total_chars}"
像这样

original size 20121
Totals 20061

为什么第二个出现短缺?

编辑:Answerers的预感是正确的:测试文件中有60行。如果我改变这一行

  total_chars += line.length + 1

它完美无缺。但是在* nix上这种改变是错误的吗?

修改:现在跟进here。谢谢!

3 个答案:

答案 0 :(得分:5)

文件中存储了描述线条的特殊字符:

  • Windows / DOS上的CR LF(0x0D 0x0A)(\ r \ n)和
  • 0x0A(\ n)在UNIX系统上。

Ruby的gets使用UNIX方法。因此,如果您读取Windows文件,则在读取的每一行时将丢失1个字节,因为\ r \ n字节将转换为\ n。

同样String.length不能很好地衡量字符串的大小(以字节为单位)。如果String不是ASCII,则一个字符可能由多个字节(Unicode)表示。也就是说,它返回String中的字符数,而不是字节数。

要获取文件的大小,请使用File.size(file_name)

答案 1 :(得分:3)

我的猜测是你在Windows上,而你的“testThis.txt”文件有\ r \ n行结尾。在文本模式下打开文件时,每行结尾将转换为单个\ n字符。因此,每行会丢失1个字符。

你的测试文件中有60行吗?这与这种解释是一致的。

答案 2 :(得分:3)

线路终结问题是最有可能的罪魁祸首。

值得注意的是,如果文本文件的字符编码不是ASCII,那么2之间也会有差异。如果文件是UTF-8,这将适用于仅使用标准ASCII字母符号的英语和一些欧洲语言。除此之外,文件大小和字符数量可能会有很大差异(与字符数相比,文件大小最多为4倍甚至6倍)。

依赖'1个字符= 1个字节'只是要求麻烦,因为它几乎肯定会在某个时候失败。