You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数据摄入阶段报错: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情况

额外排查建议

  1. 检查notebooks/data/gemstone.csv文件是否存在,路径是否正确
  2. 确认程序有读取该文件和写入artifacts目录的权限
  3. 查看日志文件,获取更详细的错误信息,定位异常发生的具体环节

内容的提问来源于stack exchange,提问作者bhavay bukkal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:39:53