Windows转Linux文件读取代码迁移:cv2.resize报错(文件为空)排查求助
我刚帮朋友排查过类似的跨平台迁移问题,你的情况大概率是路径处理不兼容加上几个Linux特有的细节没注意到,咱们一步步来解决:
1. 最核心的问题:路径分隔符不跨平台
你代码里用了path1 + '\\' + im2,Windows下\\是正确的路径分隔符,但Linux只认/,这样拼接出来的路径会变成C:/Users/L/Software/Data/channels/ch3\filename.jpg,这种混合分隔符的路径Linux根本识别不了,自然读不到文件。
解决办法:用os.path.join()自动适配平台分隔符,这是跨平台路径处理的标准做法,替换掉手动拼接:
import os import cv2 from numpy import array path1 = '/home/your_username/Software/Data/channels/ch3' # 替换成Linux下的实际路径 listing = os.listdir(path1) ch3_matrix = array([ array(cv2.resize(cv2.imread(os.path.join(path1, im2), 0), (55,55))).flatten() for im2 in listing if os.path.isfile(os.path.join(path1, im2)) # 过滤掉子目录,避免读取文件夹 ])
2. 检查Linux下的文件权限
Linux对文件/目录权限的要求比Windows严格得多,如果你的用户没有读取ch3目录下文件的权限,cv2.imread会返回None,后续resize就会报错“文件内容为空”。
检查方法:打开终端,进入该目录,执行ls -l,看文件的权限列(比如-rw-r--r--),确保当前用户有读权限(r)。如果没有,执行sudo chmod +r *.jpg(假设是jpg文件)给所有文件加读权限,或者调整目录权限:sudo chmod +rx /home/your_username/Software/Data/channels/ch3。
3. 注意文件名大小写敏感
Windows不区分文件名大小写,但Linux是严格区分的!比如Windows下Image.jpg和image.jpg是同一个文件,但Linux下会被当成两个不同的文件。如果你迁移文件时大小写没对应上,也会导致读不到文件。
解决办法:核对listing输出的文件名和实际文件的大小写是否完全一致,或者迁移文件时保持原文件名的大小写。
4. 务必检查cv2.imread的返回值
不管什么系统,都应该养成先判断图片是否读取成功的习惯,避免None传入cv2.resize导致报错。可以修改代码增加判断:
ch3_matrix = [] for im2 in listing: img_path = os.path.join(path1, im2) if not os.path.isfile(img_path): continue img = cv2.imread(img_path, 0) if img is None: print(f"警告:无法读取文件 {img_path}") continue resized_img = cv2.resize(img, (55,55)) ch3_matrix.append(resized_img.flatten()) ch3_matrix = array(ch3_matrix)
这样能快速定位到底是哪个文件读不出来,方便排查问题。
内容的提问来源于stack exchange,提问作者Luke Johnston

