os.path.realpath获取文件路径结果与实际位置不符问题咨询
问题根因
你对os.path.abspath()的功能理解错了。这个函数不会全局检索你传入的文件实际存储位置,它的逻辑非常简单:把你传入的字符串路径,和当前Python进程的工作目录(你运行代码时所处的文件夹,从返回结果看就是C:\Users\f002722\Stage NLP)拼接成绝对路径,不管这个文件是不是真的存在。
你的目标文件明明存在Downloads文件夹里,根本不在当前工作目录下,用这段代码拿到的路径从一开始就是错的,当然在Stage NLP目录下枚举不到对应的doc文件。
正确实现方案
移动文件直接用shutil模块就行,比os自带的重命名方法兼容性更好,跨磁盘分区也能正常操作,步骤如下:
- 不要靠
abspath猜路径,直接明确源文件和目标目录的位置,用os.path.expanduser可以自动适配当前Windows用户的目录,不用硬写用户名 - 移动前先校验源文件是否存在,避免路径写错报错
- 移动完成后可以直接枚举目标目录校验结果
对应可直接运行的代码:
import os import shutil # 自动获取当前用户目录下的对应路径,不用硬写f002722这类用户名 src_file = os.path.expanduser(r"~\Downloads\N_PR_8705_004A_.doc") dst_folder = os.path.expanduser(r"~\Stage NLP") dst_file = os.path.join(dst_folder, "N_PR_8705_004A_.doc") # 先检查源文件是否存在 if not os.path.isfile(src_file): print(f"源文件路径错误,未找到文件:{src_file}") else: shutil.move(src_file, dst_file) print("文件移动完成,目标目录下的doc文件如下:") print([f for f in os.listdir(dst_folder) if f.endswith(".doc")])
避坑提示
- 只要是相对路径,传给
os.path.abspath/os.path.realpath时,都是基于os.getcwd()返回的当前工作目录做拼接,没有全盘搜索功能,哪怕文件完全不存在,也会返回一个格式合法的路径,没有任何校验效力 - 做文件移动、删除这类操作时,尽量写绝对路径,不要依赖当前工作目录——很多IDE、命令行环境启动Python时的工作目录和你以为的位置不一样,很容易出问题
- 跨目录/跨盘移动文件优先用
shutil.move,os.rename在跨分区场景下会直接报错。
内容的提问来源于stack exchange,提问作者KB-kodax
相关产品推荐
相关产品推荐

