如何快速将file.info()的size元素从字节转换为KB,MB,GB等?

Dan*_*her 25 r

我希望在stackoverflow上已经有了这个答案,我根本找不到它.

期望的结果: 快速将file.info()调用中的文件大小元素从字节转换为KB,MB等.如果输出是i)具有所需大小类型的字符串,例如,"96 bytes"或者ii)简单的数字转换,我很好例如,从60963字节到60.963KB(每个Google).

Repro步骤:

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

    dir.create("census-app/data")
    
    Run Code Online (Sandbox Code Playgroud)
  2. 下载文件(~60KB):

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

    file.info("census-app//data//counties.rds")$size
    [1] 60963
    
    Run Code Online (Sandbox Code Playgroud)

从那里,我被卡住了.我意识到我可以进行一些复杂/手动解析和计算来进行转换(请参阅将千字节,兆字节等转换为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
Run Code Online (Sandbox Code Playgroud)

MrF*_*ick 34

object.size()函数为其结果执行此类型的格式化,但它的目的是告诉您传递给它的R对象的大小.它没有设置为采用任意值.

但是,我们可以"窃取"它的一些格式化逻辑.你可以用它来调用它

utils:::format.object_size(60963, "auto")
# [1] "59.5 Kb"
Run Code Online (Sandbox Code Playgroud)

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

  • 调用`utils ::: format.object_size()`的正确方法是调用`format()`并确保传递的对象具有class属性集.这可以作为`size < - structure(size,class ="object_size")`然后`format(size,units ="auto")`,或者一次性格式化(结构(大小,类=) object_size"),units ="auto")`. (5认同)
  • 这个案子有点不寻常.我查找了一个我认为可以进行格式化的函数,找到`object.size()`,然后查看源代码(不带括号的类型`object.size`).我看到它返回"object_size"类型的对象.(但是使用带有下划线的句点的函数并不常见,它可能是任何东西).然后我用`methods(class ="object_size")`查找该类的方法,并找到了格式化函数. (3认同)

Gre*_*nes 15

使用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"
Run Code Online (Sandbox Code Playgroud)

我目前正在准备发布2.16.0的gdata,它增加了指示您想用于报告大小的单位的能力,以及"Unix"风格的单位.

> 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"
Run Code Online (Sandbox Code Playgroud)

-Greg [gdata包的维护者]

更新

CRAN已接受gdata版本2.16.1,它支持standard="Unix"units=选项,它应该很快就可以在CRAN镜像上使用.

  • 我第二次为此使用`gdata::humanReadable()`,特别是因为R自己的`format()`函数用于`object_size`对象使用*不正确*符号,例如Kb(=Kbits),当它应该使用KB(或KiB) ,参见 https://stat.ethz.ch/pipermail/r-devel/2014-September/069755.html (2认同)