如何快速将file.info()函数中的文件大小元素从字节转换为KB、MB、GB等单位?

37

我希望在stackoverflow上已经有了针对这个问题的答案,只是我没有找到它。

期望结果: 快速将 file.info() 中的文件大小元素从字节转换为KB、MB等单位。如果输出是 i) 所需大小类型的字符字符串,例如:"96字节"或 ii) 简单的数字转换,例如:从 60963 字节转换成 60.963 KB(参见 Google)。

重现步骤:

  1. 创建一个文件夹来存储文件:

  2. dir.create("census-app/data")
    
  3. 下载文件(约60KB):

    download.file("http://shiny.rstudio.com/tutorial/lesson5/census-app/data/counties.rds",
    "census-app/data/counties.rds")
    
  4. 使用file.info()$size以字节为单位返回文件大小:

    file.info("census-app//data//counties.rds")$size
    [1] 60963
    

从那里开始,我陷入了困境。我意识到我可以进行一些复杂/手动的解析和计算来进行转换(请参见在R中将千字节、兆字节等转换为字节)。

但是,我希望我可以简单地使用一个基本函数或类似的东西:

    format(file.info("census-app//data//counties.rds")$size, units = "KB")
    [1] "60963"
    # Attempt to return file size in KB simply returns the size in bytes
    # NOTE: format(x, units = "KB") works fine when I
    # pass it object.size() for an object loaded in R

一个显然被删除的评论提出了一个有价值的观点,我想回答一下:为什么不只使用“x字节/1024”的简单数学来返回KB中的值?我同意这是一个简单的计算,我的目标之一是避免手动干预,a)以防我意外输入1000而不是1024,b)放弃研究正确的转换比率。 - Daniel Fletcher
2个回答

52
object.size(format(object))

to get a nicely formatted result for any object you pass to it.

utils:::format.object_size(60963, "auto")
# [1] "59.5 Kb"

通过这种方式,我们可以调用未导出的格式化函数。您可以在?format.object_size帮助页面上打开其他格式选项。请注意,它使用的规则是1 Kb = 1024字节(而不是您示例中的1000)。


1
谢谢您,先生!当我调用?format.object_size时,帮助页面会指向object.size {utils}。请问您能否解释一下我何时需要将函数object.size()扩展为some_function.object_size,或者给我一个说明性的资源?我推断这是两个函数的简单组合,猜测需要将_字符更改为.。正确吗? - Daniel Fletcher
3
这个案例有点不寻常。我在寻找可能执行格式化的函数时,找到了object.size(),然后查看了源代码(输入object.size但不加括号)。我发现它返回一个类型为“object_size”的对象。(但通常很少使用将句点替换为下划线的函数,并且它可能是任何东西)。然后我用methods(class="object_size")查找了该类的方法,并找到了格式化函数。 - MrFlick
8
调用 utils:::format.object_size() 的正确方法是通过调用 format() 并确保传递的对象已设置类属性。可以通过以下方式完成:size <- structure(size, class="object_size"),然后 format(size, units="auto"),或者一步到位地使用 format(structure(size, class="object_size"), units="auto") - HenrikB
1
现在也支持国际单位制:format(structure(2^32-1, class="object_size"), units="auto", standard="SI") 感谢 @HenrikB,详情请见 https://github.com/HenrikBengtsson/Wishlist-for-R/issues/6 - ismirsehregal

23
使用gdata包中的humanReadable()函数。它可以选择使用1000进制('SI')或1024进制('IEC')单位来报告大小,而且它还是矢量化的,因此您可以同时处理整个大小向量。
例如:
> humanReadable(c(60810, 124141, 124, 13412513), width=4)
[1] "60.8 kB" "124 kB"  "124 B"   "13.4 MB"
> humanReadable(c(60810, 124141, 124, 13412513), standard="IEC", width=4)
[1] "59.4 KiB" "121 KiB"  "124 B"    "12.8 MiB"

我目前正在准备发布gdata 2.16.0版本,该版本新增了指定报告大小单位和"Unix"-style单位的功能。

> humanReadable(c(60810, 124141, 124, 13412513), standard="SI", units="kB")
[1] "   60.8 kB" "  124.1 kB" "    0.1 kB" "13412.5 kB"
> humanReadable(c(60810, 124141, 124, 13412513), standard="IEC", units="KiB")
[1] "   59.4 KiB" "  121.2 KiB" "    0.1 KiB" "13098.2 KiB"
humanReadable(c(60810, 124141, 124, 13412513), standard="Unix", units="K")
[1] "   59.4 K" "  121.2 K" "    0.1 K" "13098.2 K"

-Greg [gdata程序包的维护者]

更新

CRAN已经接受了gdata 2.16.1版本,该版本支持standard="Unix"units=选项,并且很快将在CRAN镜像上提供。


2
对于这个问题,我推荐使用gdata::humanReadable()函数,尤其是因为R自带的format()函数在处理object_size对象时使用了错误的符号表示法,比如Kb(=千位)而不是KB(或者KiB),参考链接:https://stat.ethz.ch/pipermail/r-devel/2014-September/069755.html - HenrikB

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