使用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
相关产品推荐
相关产品推荐

