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

使用os.path.abspath结合os.listdir无法获取完整路径的问题

问题原因分析

你遇到的问题核心在于os.listdir()的行为:它只会返回指定目录下的文件名/子目录名,而不是完整路径。当你直接对这些文件名调用os.path.abspath(x)时,Python会把当前的工作目录(你运行脚本时所在的目录)和文件名拼接起来,而不是你传入os.listdir()的那个目标目录。

举个例子,如果你的脚本运行时所在的目录是C:/Users/sean/Documents/uni/ANLP/Data,那os.path.abspath("19-norandrostenedione_ddi.xml")自然就会生成C:\Users\sean\Documents\uni\ANLP\Data\19-norandrostenedione_ddi.xml,漏掉了后面的Train/DrugBank部分。

解决方案

这里有两种简单的修复方法,任选其一即可:

方法1:用os.path.join()拼接目录与文件名

先把目标目录和os.listdir()返回的文件名拼接成完整路径,再转成绝对路径,这样就不会依赖当前工作目录了:

import os

target_dir = "C:/Users/sean/Documents/uni/ANLP/Data/Train/DrugBank"
trainDB = [os.path.abspath(os.path.join(target_dir, x)) for x in os.listdir(target_dir)]

os.path.join()会自动处理不同操作系统的路径分隔符(Windows的\和Linux/macOS的/),比手动拼接字符串更可靠。

方法2:用pathlib模块(Python 3.4+推荐)

pathlib是Python标准库中更现代化的路径处理工具,语法更直观,代码可读性更高:

from pathlib import Path

target_dir = Path("C:/Users/sean/Documents/uni/ANLP/Data/Train/DrugBank")
trainDB = [str(file.resolve()) for file in target_dir.iterdir()]
  • target_dir.iterdir()会返回目录下所有条目的Path对象(包含完整的相对路径)
  • resolve()方法将路径转换为绝对路径
  • 最后用str()把Path对象转成字符串格式,和你原来的输出类型保持一致
额外提示

如果只想获取目录下的文件(排除子目录),可以在列表推导式里加个判断:

  • 用os模块:
    trainDB = [os.path.abspath(os.path.join(target_dir, x)) for x in os.listdir(target_dir) if os.path.isfile(os.path.join(target_dir, x))]
    
  • 用pathlib模块:
    trainDB = [str(file.resolve()) for file in target_dir.iterdir() if file.is_file()]
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:15:26