Estoy tratando de leer todo el contenido de un archivo binario. Similar al siguiente código de Python:

with open("Male_Moose.jpg") as f:
  data = f.read()

  print "Length of file: ", len(data)

Y este es mi código R:

main <- function()
{
  fname <- "Male_Moose.jpg"
  contents <- readBin(fname, file.info(fname)$size)

  cat(paste("File size:     ", nchar(contents, type = "bytes")))
  cat("\n\n")
  cat(paste("File info size:", file.info(fname)$size))
  cat("\n\n")
}

main()

El archivo JPG es de aproximadamente 1,2 megabytes. El código de Python se lee correctamente en el archivo como un blob y puedo encontrar su longitud en la memoria. R no hace las cosas de la misma manera. ¿Por qué es esto?

[editar]

La salida del script R:

File size:      20

File info size: 1261900
r
2
gp443 13 dic. 2016 a las 17:41

2 respuestas

La mejor respuesta

Dejó fuera el segundo argumento para readBin, que es el tipo de datos que desea leer:

readBin(con, what, n = 1L, size = NA_integer_, signed = TRUE,
        endian = .Platform$endian)

Especifique qué como "raw", que leerá los datos como un vector de bytes sin procesar:

contents <- readBin(fname, "raw", file.info(fname)$size)
length(contents)  # not nchar()
6
Hong Ooi 13 dic. 2016 a las 14:57

Puede que le resulte más fácil utilizar el paquete jpeg.

library(jpeg)
MooseImage = readJPEG("Male_Moose.jpg")

Y luego, si solo quieres una gota

MooseBlob = as.vector(MooseImage)
2
G5W 13 dic. 2016 a las 15:23