0

我学了 8 个月的 python,R 的新手,有一个二进制文件,我可以读取
二进制数据并将其更改为列表(在 python 中,数组是列表)。
数据文件(名为 test )位于:
https
://www.box.com/s/0g3qg2lqgmr7y7fk5aut 结构为:
每 4 个字节是一个整数,因此在 python 中使用 unpack 读取它

import struct
datafile=open('test','rb')
data=datafile.read(32)
result=[]
while  data:
    result.append(list(struct.unpack('iiiiiiii',data)))
    data=datafile.read(32)

如何读取 R 中的二进制数据?

Paul Hiemstra 帮助我完成了 R 中的代码,这让我受益匪浅。

datafile="test"
totalsize=file.info(datafile)$size
lines=totalsize/32
data=readBin("test",integer(),n=totalsize,size=4,endian="little")
result=data.frame(matrix(data,nrow=lines,ncol=8,byrow=TRUE))
colnames(result)=c(date,"x1","x2","x3","x4","x5","x6","x7")

还有我想解决的问题。在这里,我用n=totalsize完全读取所有数据,如果数据很大,内存不够容纳,如何表达:从第1001个字节到第2000个字节读取数据?如果n=1000,表示从第1个到第1000个读取数据,如果n=2000,表示从第1个到第2000个读取数据,那么从第1001个到第2000个读取数据怎么样?R中是否有文件指针?当我读取第1000个二进制数据时,文件指针在第1000个位置,现在使用命令readBin(“test”,integer(),n = 1000,size = 4,endian =“little” ) 读取第 1001 到第 2000 的数据?

4

1 回答 1

6

谷歌搜索R read binary file产生以下链接作为其第一个结果。底线是使用该readBin功能,在您的情况下,它看起来像:

file2read = file("test", "rb")
number_of_integers_in_file = 128
spam = readBin(file2read, integer(), number_of_integers_in_file, size = 4)
close(file2read)

如果你不知道文件中的整数个数,你可以做一些事情,首先创建一个示例文件:

# Create a binary file that we can read
l = as.integer(1:10)
file2write = file("/tmp/test", "wb")
writeBin(l, file2write)
close(file2write)

一种策略是高估要读取的整数数量 readBin 只会返回真正存在的数字。大小为 的向量n是预先分配的,因此请注意使其过大。

file2read = file("/tmp/test", "rb")
l_read = readBin(file2read, integer(), n = 100)
close(file2read)
all.equal(l, l_read)
[1] TRUE

或者,如果您知道数字的大小(例如 4 个字节),则可以使用我编写的以下函数来计算存在的数量:

number_of_numbers = function(path, size = 4) {
  # If path is a file connection, extract file name
  if(inherits(path, "file")) path = summary(path)[["description"]]
  return(file.info(path)[["size"]] / size)
 }
number_of_numbers("/tmp/test")
[1] 10

在行动:

file2read = file("/tmp/test", "rb")
l_read2 = readBin(file2read, integer(), n = number_of_numbers(file2read))
close(file2read)
all.equal(l, l_read2)   
[1] TRUE

如果数据量太大而无法放入内存,我建议分块读取。这可以通过连续调用来完成readBin,例如:

first_1000 = readBin(con, integer(), n = 1000)
next_1000 = readBin(con, integer(), n = 1000)

如果您想跳过部分数据文件,比如前 1000 个数字,请使用该seek功能。这比读取 1000 个数字、丢弃这些数字并读取第二个 1000 个数字要快得多。例如:

# Skip the first thousand 4 byte integers
seek(con, where = 4*1000)
next_1000 = readBin(con, integer(), n = 1000)
于 2012-09-04T05:25:30.230 回答