Python读取图片时报错OSError: Initializing from file failed如何解决?
问题排查与解决方案
核心报错根本原因
你触发OSError: Initializing from file failed的核心原因是**pd.read_csv()方法传入的是文件夹路径,而非单个CSV文件路径**:
你代码中调用pd.read_csv()时传入的路径是C:\\Users\\sanch\\AppData\\Local\\Programs\\Python\\Python36\\Lib\\site-packages\\tensorflow\\tensorflow-for-poets-2-master\\tf_files\\test_data,从你前面写的os.walk遍历该路径的逻辑也能确认这是一个存放多个文件的目录,read_csv不支持直接读取文件夹。
其他可预见的代码错误
除了文件读取问题,你的代码还存在以下问题,修复文件问题后会依次触发:
- 未定义
test_data变量就直接调用,会报变量未定义错误 - 重复三次定义
create_model函数,最后一次定义会覆盖前两次的逻辑 - Keras API调用错误:
model.complete应为model.compile;tf.keras.KerasClassifier是错误引用,正确引用路径是tensorflow.keras.wrappers.scikit_learn.KerasClassifier;GridSearchCV属于sklearn库而非Keras库;参数名build_nf应为build_fn、ephochs应为epochs - 模型训练代码写在
create_model函数定义内、return语句之后,属于死代码永远不会执行,且函数定义阶段调用还未加载的X_train变量会报错
可行修复步骤
第一步:修复文件读取问题
根据你的实际场景二选一即可:
- 如果你要读取的是目录下单个指定CSV文件,直接把路径替换为具体CSV文件的完整路径,示例如下:
# 替换为你实际的训练集CSV文件名 train_data = pd.read_csv("C:\\Users\\sanch\\AppData\\Local\\Programs\\Python\\Python36\\Lib\\site-packages\\tensorflow\\tensorflow-for-poets-2-master\\tf_files\\test_data\\train.csv", delimiter=',', nrows=nRowsRead) # 补充加载测试集的代码,替换为实际测试集CSV文件名 test_data = pd.read_csv("C:\\Users\\sanch\\AppData\\Local\\Programs\\Python\\Python36\\Lib\\site-packages\\tensorflow\\tensorflow-for-poets-2-master\\tf_files\\test_data\\test.csv", delimiter=',', nrows=nRowsRead)
如果路径仍解析失败,可以加engine='python'参数规避C引擎的路径兼容问题:pd.read_csv(xxx, engine='python')
2. 如果你要读取目录下所有CSV文件合并为训练集,使用如下代码替换原有pd.read_csv部分:
import glob # 匹配目录下所有csv文件 csv_file_list = glob.glob("C:\\Users\\sanch\\AppData\\Local\\Programs\\Python\\Python36\\Lib\\site-packages\\tensorflow\\tensorflow-for-poets-2-master\\tf_files\\test_data\\*.csv") # 合并所有csv为一个DataFrame train_data = pd.concat([pd.read_csv(file, delimiter=',') for file in csv_file_list], ignore_index=True)
第二步:修复其他逻辑错误
- 保留一个
create_model函数即可,删除另外两个重复的函数定义 - 把
create_model函数内的model.complete修改为model.compile - 在代码顶部补充导入语句:
from tensorflow.keras.wrappers.scikit_learn import KerasClassifier from sklearn.model_selection import GridSearchCV
- 修正GridSearch相关代码的错误:把
tf.keras.KerasClassifier改为KerasClassifier、build_nf改为build_fn、ephochs改为epochs、tf.keras.GridSearchCV改为GridSearchCV - 把所有模型训练、网格搜索的代码移动到
if __name__ == '__main__'块内,放在数据集加载完成的代码之后,删除create_model函数内return之后的死代码
内容的提问来源于stack exchange,提问作者Александр Трегубов
相关产品推荐
相关产品推荐

