Python跨父目录调用同名文件时os.path.join路径异常问题
问题解析与解决方案
核心原因
你遇到的问题源于Windows系统对路径的特殊处理:c:Users\chale\...是C盘当前工作目录的相对路径,而C:\Users\chale\...才是绝对路径。手动拆分路径后,os.path.join生成了相对路径,自然找不到目标文件。
官方文档说明(翻译)
在Windows系统中,当遇到根路径段(例如
r'\foo')时,驱动器不会被重置。如果某个路径段属于不同驱动器或为绝对路径,则之前所有的路径段都会被忽略,驱动器会被重置。注意,由于每个驱动器都有一个当前目录,os.path.join("c:", "foo")表示的是C盘当前目录下的相对路径(即c:foo),而非绝对路径c:\foo。
简单来说:c:开头的路径是相对该驱动器当前目录的,而c:\开头的才是从驱动器根目录开始的绝对路径。你硬编码的r'C:\Users\...'是绝对路径,所以能找到文件;而拼接出来的c:Users\...是相对路径,指向的是C盘当前工作目录下的Users文件夹(而非根目录下的),因此报错。
正确实现方式
不要手动拆分路径,利用Python的路径工具直接定位上层目录,更简洁且不易出错:
方式1:使用Pathlib(推荐,Python 3.4+)
from pathlib import Path # 获取当前Python文件的绝对路径对象 current_file = Path(__file__).resolve() # 提取文件名(不含后缀) file_name = current_file.stem # 定位到项目根目录下的sql-files文件夹,拼接目标SQL文件路径 sql_file_path = current_file.parent.parent / "sql-files" / f"{file_name}.sql" # 安全打开文件(用with语句自动关闭) with open(sql_file_path, 'r') as sql_file: sql_content = sql_file.read() # 后续执行SQL、pandas处理逻辑... # 写入extract-files目录 csv_file_path = current_file.parent.parent / "extract-files" / f"{file_name}.csv" # df.to_csv(csv_file_path) # 假设df是处理后的DataFrame
方式2:使用os.path模块
import os # 获取当前Python文件的绝对目录 current_dir = os.path.dirname(os.path.abspath(__file__)) # 定位到项目根目录(当前目录的上层目录) root_dir = os.path.dirname(current_dir) # 提取文件名(不含后缀) file_name = os.path.splitext(os.path.basename(__file__))[0] # 拼接SQL文件路径 sql_file_path = os.path.join(root_dir, "sql-files", f"{file_name}.sql") # 打开文件 with open(sql_file_path, 'r') as sql_file: sql_content = sql_file.read() # 后续处理... # 拼接CSV文件路径 csv_file_path = os.path.join(root_dir, "extract-files", f"{file_name}.csv")
内容的提问来源于stack exchange,提问作者Connor Hale
相关产品推荐
相关产品推荐

