使用cnpy库npy_load读取.npy文件时文件名被篡改的问题如何修复
修复cnpy库npy_load读取含多点文件名的问题
方案一:重命名文件(最快捷)
把文件名里的点换成下划线这类不会触发解析逻辑的符号,比如将1234.4567.npy改为1234_4567.npy,原代码不需要修改就能正常读取。
方案二:修改cnpy源码(彻底解决)
cnpy的npy_load函数内部错误地将文件名中的第一个点替换成了逗号,找到cnpy.cpp里处理文件名的代码段,修正解析逻辑:
- 定位到
npy_load函数中解析文件名的部分,通常是查找第一个点并分割的代码。 - 将逻辑改为仅识别最后一个点(对应
.npy扩展名的分隔),或者直接保留原文件名不做替换。
例如,把错误的点替换逻辑:
size_t dot_pos = fname.find('.'); std::string modified_name = fname.substr(0, dot_pos) + "," + fname.substr(dot_pos + 1);
改成仅提取扩展名、保留原文件名的逻辑:
size_t last_dot = fname.find_last_of('.'); std::string base_name = fname.substr(0, last_dot); std::string ext = fname.substr(last_dot); // 后续直接使用原fname进行文件操作
方案三:绕过自动解析,手动加载数据
不依赖npy_load的自动文件名解析,手动打开文件并加载:
void getdescriptor(string filename,cv::Mat &descriptor,int nkeypoints){ std::ifstream file(filename, std::ios::binary); if (!file.is_open()) { throw std::runtime_error("无法打开文件: " + filename); } // 读取npy文件头并加载数据 cnpy::NpyArray arr = cnpy::read_npy_header(file); arr.load(file); // 原数据拷贝逻辑保持不变 for(int i = 0 ; i < nkeypoints ; i ++){ float* pdata = descriptor.ptr<float>(i); for(int j = 0 ; j < 256 ; j ++ ){ float temp = arr.data<float>()[i * 256 + j]; pdata[j] = temp; } } }
内容的提问来源于stack exchange,提问作者Capdi
相关产品推荐
相关产品推荐

