数据摄入阶段报错:TypeError: 无法解包不可迭代的NoneType对象
训练流水线数据摄入阶段报错:无法解包NoneType对象
问题现象
运行training_pipeline.py时触发数据摄入阶段错误,报错信息如下:
Traceback (most recent call last): File "src\pipelines\training_pipeline.py", line 12, in <module> train_data_path,test_data_path = obj.initiate_data_ingestion() TypeError: cannot unpack non-iterable NoneType object
相关代码
data_ingestion.py
import os import sys import pandas as pd from src.logger import logging from src.exception import CustomException from src.components.data_ingestion import DataIngestion if __name__=='__main__': obj = DataIngestion() train_data_path,test_data_path = obj.initiate_data_ingestion() print(train_data_path,test_data_path)
training_pipeline.py
import os import sys from src.exception import CustomException from src.logger import logging import pandas as pd from sklearn.model_selection import train_test_split from dataclasses import dataclass ## intialize the data ingestion configuration @dataclass class DataIngestionconfig: train_data_path=os.path.join('artifacts','train.csv') test_data_path=os.path.join('artifacts','test.csv') raw_data_path=os.path.join('artifacts','raw.csv') ## create a data ingestion class class DataIngestion: def __init__(self): self.ingestion_config=DataIngestionconfig() def initiate_data_ingestion(self): logging.info('Data Ingestion method starts') try: df=pd.read_csv(os.path.join('notebooks/data','gemstone.csv')) logging.info('Dataset read as pandas Dataframe') os.makedirs(os.path.dirname(self.ingestion_config.raw_data_path),exist_ok=True) df.to_csv(self.ingestion_config.raw_data_path,index=False) logging.info("Train test split") train_set,test_set = train_test_split(df,test_size=0.30,random_state=42) train_set.to_csv(self.ingestion_config.train_data_path,index=False,header=True) test_set.to_csv(self.ingestion_config.test_data_path,index=False,header=True) logging.info('Ingestion of data is completed') return( self.ingestion_config.train_data_path, self.ingestion_config.test_data_path ) except Exception as e: logging.info('Error occured in Data Ingestion config') if __name__=="__main__": obj=DataIngestion() train_data_path,test_data_path=obj.initiate_data_ingestion()
问题原因
initiate_data_ingestion()方法的try块中如果发生异常(比如文件路径错误、文件不存在、权限问题等),会进入except块,但该块仅记录日志,没有返回任何值,导致方法默认返回None。而你尝试将None解包为两个变量,因此触发TypeError。你之前尝试修改返回值的形式(比如改成列表)无效,因为异常发生时根本没走到正常返回的代码逻辑。
解决方案
修改except块,要么抛出异常让错误显性化,要么返回一个可迭代对象(更推荐抛出异常,以便排查根本问题):
方案1:抛出自定义异常(推荐)
在except块中抛出你定义的CustomException,这样能终止流程并明确提示错误原因:
except Exception as e: logging.info('Error occured in Data Ingestion config') raise CustomException(e, sys) # 抛出自定义异常,传递错误信息和系统上下文
方案2:返回默认可迭代对象(不推荐,隐藏错误)
如果希望流程继续执行,可返回一个包含默认值的元组:
except Exception as e: logging.info('Error occured in Data Ingestion config') return (None, None) # 返回可迭代对象,避免解包报错,但后续逻辑需处理None情况
额外排查建议
- 检查
notebooks/data/gemstone.csv文件是否存在,路径是否正确 - 确认程序有读取该文件和写入
artifacts目录的权限 - 查看日志文件,获取更详细的错误信息,定位异常发生的具体环节
内容的提问来源于stack exchange,提问作者bhavay bukkal
相关产品推荐
相关产品推荐

