写入artifacts目录下raw.csv时出现Permission Denied错误求助
权限拒绝问题排查与修复
问题描述
尝试读取notebooks/data/Dataset.csv并保存到artifacts/raw.csv时,已为artifacts文件夹授予权限,但仍报错:
[Errno 13] Permission denied: 'artifacts\raw.csv'
问题代码
@dataclass class DataIngestionConfig: train_data_path:str = os.path.join("artifacts/train_data") test_data_path:str = os.path.join("artifacts/test_data") raw_data_path:str = os.path.join('artifacts','raw.csv') # 权限拒绝发生在这个路径 ^ class DataIngestionPhase: def __init__(self): self.dataIngestionConfig = DataIngestionConfig def dataIngestion(self): mlflow_logs = Mlflow_logs() with mlflow.start_run(): logging.info("Data Ingestion Phase Start") mlflow_logs.log_msg("Data Ingestion Phase Start") try: df = pd.read_csv("notebooks/data/Dataset.csv") os.makedirs(os.path.join(self.dataIngestionConfig.raw_data_path), exist_ok=True) df.to_csv(self.dataIngestionConfig.raw_data_path, index=False) except Exception as e: mlflow_logs.log_msg(f"Exception : {e}") raise CustomException(e,sys)
问题原因与修复方案
- 核心错误点:代码中
os.makedirs(os.path.join(self.dataIngestionConfig.raw_data_path), exist_ok=True)错误地将raw.csv文件路径当作文件夹路径创建。os.path.join(self.dataIngestionConfig.raw_data_path)得到的是artifacts/raw.csv,调用os.makedirs会尝试创建名为raw.csv的文件夹,后续写入文件时,要么因同名文件夹存在无法写入,要么创建文件夹时就触发权限问题,最终导致权限拒绝报错。 - 修复步骤:
- 修改目录创建逻辑,仅创建
raw.csv所在的父目录,而非包含文件名的路径:os.makedirs(os.path.dirname(self.dataIngestionConfig.raw_data_path), exist_ok=True) - 确认
artifacts目录的权限:- Windows:右键
artifacts文件夹→属性→安全,确保当前用户拥有写入权限 - Linux/macOS:执行
chmod -R 755 artifacts调整权限(按需修改)
- Windows:右键
- 检查
raw.csv是否被其他程序占用(如Excel),占用状态下无法写入。
- 修改目录创建逻辑,仅创建
- 潜在bug修复:原代码中
self.dataIngestionConfig = DataIngestionConfig未实例化类,需改为self.dataIngestionConfig = DataIngestionConfig(),否则无法正确访问配置属性。
修复后的代码片段
@dataclass class DataIngestionConfig: train_data_path:str = os.path.join("artifacts/train_data") test_data_path:str = os.path.join("artifacts/test_data") raw_data_path:str = os.path.join('artifacts','raw.csv') class DataIngestionPhase: def __init__(self): self.dataIngestionConfig = DataIngestionConfig() def dataIngestion(self): mlflow_logs = Mlflow_logs() with mlflow.start_run(): logging.info("Data Ingestion Phase Start") mlflow_logs.log_msg("Data Ingestion Phase Start") try: df = pd.read_csv("notebooks/data/Dataset.csv") os.makedirs(os.path.dirname(self.dataIngestionConfig.raw_data_path), exist_ok=True) df.to_csv(self.dataIngestionConfig.raw_data_path, index=False) except Exception as e: mlflow_logs.log_msg(f"Exception : {e}") raise CustomException(e,sys)
内容的提问来源于stack exchange,提问作者Chinmaya Tewari
相关产品推荐
相关产品推荐

