Julia中如何读取大小未知的BIN二进制文件?
Julia 无需提前指定大小读取BIN文件方案
你原有代码需要提前固定数组长度,是因为read!函数的逻辑是向已预分配的内存空间填充数据,必须提前确定数组维度。不需要提前获知文件大小的读取方式可以直接用read函数实现,它会自动根据文件内容和指定的元素类型生成匹配长度的数组。
单文件读取实现
直接指定读取的元素类型为Float32即可,代码会自动计算文件可解析的元素总数,无需手动预分配数组:
y = open("test_file.bin") do io read(io, Float32) end
上述写法的逻辑是自动读取整个IO流的内容,按Float32单元素占4字节的规则解析,最终返回的y是长度自适应的Vector{Float32}类型数组。
如果需要校验文件合法性,避免因文件损坏、格式不匹配读取出错,可以加一行简单的校验:
y = open("test_file.bin") do io total_bytes = filesize(io) @assert total_bytes % 4 == 0 "文件字节数不是4的整数倍,无法完整解析为Float32数组,请检查文件格式" read(io, Float32) end
多文件批量读取实现
针对不同大小的BIN文件批量读取场景,直接遍历文件路径列表,对每个文件调用上述自适应读取逻辑即可,不需要单独为每个文件指定长度:
# 替换为你的BIN文件所在目录路径 bin_dir = "./path/to/your/bin_files" # 获取目录下所有后缀为.bin的文件路径 bin_paths = [joinpath(bin_dir, f) for f in readdir(bin_dir) if endswith(f, ".bin")] # 用字典按文件名存储对应读取到的数组,不同文件的数组长度自动适配 batch_result = Dict{String, Vector{Float32}}() for path in bin_paths data = open(path) do io read(io, Float32) end batch_result[basename(path)] = data end
注意:上述实现默认你的BIN文件是连续存储的纯Float32二进制数据,不存在自定义文件头、尾或其他类型的插入字段。如果有特殊格式,只需要在调用
read前用skip(io, 偏移字节数)跳过无效段即可。
内容的提问来源于stack exchange,提问作者nbagg
相关产品推荐
相关产品推荐

