Python中PYTHONPATH的os.path以及sys.path模块简介

1.sys.path —— 动态地改变Python搜索路径

如果python中导入的package或module不在环境变量PATH中,那么可以使用sys.path将要导入的package或module加入到PATH环境变量中。

    import sys
    sys.path.append(’引用模块的地址')
    #或者
    import sys
    sys.path.insert(0, '引用模块的地址')

      sys.path是个列表,所以在末尾添加目录是很容易的,用sys.path.append就行了。当这个append执行完之后,新目录即时起效,以后的每次import操作都可能会检查这个目录。如同解决方案所示,可以选择用sys.path.insert(0,…)这样新添加的目录会优先于sys.path中的其他目录被import检查。

      即使sys.path中存在重复,或者一个不存在的目录被不小心添加进来,也没什么大不了,Python的import语句非常聪明,它会自己应付这类问题。但是,如果每次import时都发生这种错误(比如,重复的不成功搜索,操作系统提示的需要进一步处理的错误),我们会被迫付出一点小小的性能代价。

      程序向sys.path添加的目录只会在此程序的生命周期之内有效,其他所有的对sys.path的动态操作也是如此。

2.python中获取当前工作目录

  import os
  curDir = os.getcwd()

备注:os.getcwd()返回的是执行命令时所在的目录,而不是脚本本身所在的目录


3.os.path模块

    os.path.abspath(path)  #返回绝对路径
    os.path.split(path     #将path分割成目录和文件名二元组返回
    os.path.dirname(path)  #返回path的目录。其实就是os.path.split(path)的第一个元素
    os.path.basename(path) #返回path最后的文件名
    os.path.exists(path)   #如果path存在,返回True;如果path不存在,返回False
    os.path.isabs(path)    #如果path是绝对路径,返回True
    os.path.isfile(path)   #如果path是一个存在的文件,返回True。否则返回False
    os.path.isdir(path)    #如果path是一个存在的目录,则返回True。否则返回False
    os.path.getatime(path) #返回path所指向的文件或者目录的最后存取时间
    os.path.getmtime(path) #返回path所指向的文件或者目录的最后修改时间
    s.path.join(path1[, path2[, ...]])  #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略。
    >>> os.path.join('c:\\', 'csv', 'test.csv')
    'c:\\csv\\test.csv'
    >>> os.path.join('windows\temp', 'c:\\', 'csv', 'test.csv')
    'c:\\csv\\test.csv'
    >>> os.path.join('/home/aa','/home/aa/bb','/home/aa/bb/c')
    '/home/aa/bb/c'

原文链接:https://blog.youkuaiyun.com/wangjianno2/article/details/48783127
 

<think>我们被要求解释Pythonos.path.dirname的功能和相关用法。根据引用[2]和[3],我们可以得到以下信息: os.path.dirname(path) 是一个用于处理文件路径的函数。它的作用是去掉文件名,返回文件所在的目录路径。具体来说: - 如果传入一个包含文件名的完整路径,它会返回该文件所在的目录。 - 如果传入的是一个目录路径,它会返回该目录的上一级目录(因为目录也可以被看作是一种“文件”,所以它会去掉最后一级目录名)。 引用[2]中给出了几个例子: ```python print(os.path.dirname("E:/Read_File/read_yaml.py")) # 输出:E:/Read_File print(os.path.dirname("E:/Read_File")) # 输出:E:/ ``` 另外,引用[4]提到一个重要的注意事项:在交互式环境中(如命令行中直接执行Python),`__file__`变量未定义,因此使用`os.path.dirname(__file__)`会引发`NameError`。只有在实际存在的.py文件中运行时,`__file__`才表示当前文件的路径。 下面我们详细说明其用法和注意事项。 ### 功能 `os.path.dirname(path)` 返回路径 `path` 的目录名称。它通过拆分路径并返回除最后一部分(即文件名或最后一级目录名)之外的所有部分来实现。 ### 使用示例 #### 示例1:获取当前脚本所在目录 在脚本中,我们经常需要获取当前脚本所在的目录,以便读取或写入同目录下的其他文件。这时可以使用`os.path.dirname(__file__)`。 假设我们有一个脚本位于`/home/user/project/script.py`,在脚本中写入: ```python import os # 获取当前脚本的绝对路径 current_file = __file__ print("当前文件路径:", current_file) # 获取当前脚本所在目录 current_dir = os.path.dirname(__file__) print("当前文件所在目录:", current_dir) ``` 输出结果可能是: ``` 当前文件路径: /home/user/project/script.py 当前文件所在目录: /home/user/project ``` #### 示例2:获取上级目录 我们可以嵌套使用`os.path.dirname`来获取上级目录: ```python import os path = "E:/project/src/main.py" # 获取src目录 dir1 = os.path.dirname(path) print(dir1) # 输出:E:/project/src # 获取project目录 dir2 = os.path.dirname(dir1) print(dir2) # 输出:E:/project # 或者连续调用 dir3 = os.path.dirname(os.path.dirname(path)) print(dir3) # 输出:E:/project ``` #### 示例3:处理目录路径 如果传入的是一个目录路径(末尾可能有斜杠也可能没有),`os.path.dirname`会返回上一级目录: ```python import os path1 = "E:/project/src/" path2 = "E:/project/src" print(os.path.dirname(path1)) # 输出:E:/project print(os.path.dirname(path2)) # 输出:E:/project ``` ### 注意事项 1. 当路径是根目录时,`os.path.dirname`返回根目录本身(在Windows中可能是驱动器根目录,如`C:\`;在Unix中为`/`)。例如: ```python print(os.path.dirname("C:\\")) # 输出:C:\ print(os.path.dirname("/")) # 输出:/ ``` 2. 如果传入的路径只是一个文件名(没有路径),那么返回空字符串。例如: ```python print(os.path.dirname("test.py")) # 输出:空字符串 ``` 3. 在交互式环境中(如Python shell)使用`os.path.dirname(__file__)`会报错,因为`__file__`变量未定义。所以这个用法只适用于脚本文件。 4. 如果路径字符串以斜杠结尾,那么最后一部分被视为空,因此返回的是去掉末尾斜杠后的路径的目录部分。例如: ```python print(os.path.dirname("a/b/c/")) # 输出:a/b/c ``` 这是因为路径`a/b/c/`被拆分为`(a/b/c, '')`,所以目录名是`a/b/c`。 5. 该函数只是进行字符串操作,并不检查路径是否实际存在。 ### 与os.path.split的关系 引用[3]提到`os.path.split(path)`,它分割路径为两部分:目录部分和最后一部分(文件名或目录名)。`os.path.dirname(path)`实际上等价于`os.path.split(path)[0]`。 例如: ```python import os path = "a/b/c.txt" dir_name, file_name = os.path.split(path) print(dir_name) # 输出:a/b print(file_name) # 输出:c.txt # 等同于 print(os.path.dirname(path)) # 输出:a/b ``` ### 实际应用 在实际项目中,我们经常使用`os.path.dirname`来构建文件路径。例如,在项目中需要读取配置文件(与脚本在同一目录下): ```python import os # 获取当前脚本所在目录 current_dir = os.path.dirname(__file__) config_file = os.path.join(current_dir, 'config.ini') # 然后就可以打开config_file ``` 或者,获取项目根目录(假设脚本在项目下的src目录): ```python project_root = os.path.dirname(os.path.dirname(__file__)) ``` ### 总结 - `os.path.dirname(path)` 返回路径`path`的目录部分。 - 常用于获取当前脚本所在目录(结合`__file__`)。 - 可以嵌套使用以获取多级父目录。 - 注意:在交互式环境中无法使用`__file__`。 §§相关问题§§ 1.Python中如何获取当前工作目录? 2. os.path.dirname和os.path.split有什么区别? 3. 如何安全地拼接文件路径? 4.Python中如何判断一个路径是文件还是目录? 5. 使用os.path.dirname时有哪些常见错误?</think>### Python中`os.path.dirname`的功能与用法详解 `os.path.dirname()`是Python标准库`os.path`模块中的一个函数,主要用于从文件路径中提取目录部分。其核心功能是**移除路径中的文件名,返回所在目录的路径**。 #### 一、功能解析 1. **基本作用** - 输入:文件或目录的路径字符串 - 输出:该路径的父目录路径 - 公式表示:若路径为 $P = D + F$($D$为目录,$F$为文件名),则 $$ \text{os.path.dirname}(P) = D $$ 2. **关键特性** - 纯字符串操作,不检查路径实际是否存在 - 支持跨平台路径处理(Windows/Linux/macOS) - 对结尾分隔符敏感(见示例4) #### 二、使用示例 ```python import os # 示例1:标准文件路径 print(os.path.dirname("/home/user/docs/report.txt")) # 输出:/home/user/docs # 示例2:目录路径(返回上一级) print(os.path.dirname("/data/images/")) # 输出:/data # 示例3:相对路径 print(os.path.dirname("src/utils/helper.py")) # 输出:src/utils # 示例4:路径结尾分隔符的影响 print(os.path.dirname("/tmp/test/")) # 输出:/tmp print(os.path.dirname("/tmp/test")) # 输出:/tmp ``` #### 三、结合`__file__`的实用场景 `__file__`是Python内置变量,表示当前执行文件的路径。结合使用可获取脚本所在目录: ```python import os # 获取当前脚本的目录路径 script_dir = os.path.dirname(__file__) print(f"脚本目录:{script_dir}") # 构建同级文件路径 config_path = os.path.join(script_dir, "config.ini") ``` > ⚠️ **重要注意事项** > 在交互式环境(如Python Shell、Jupyter Notebook)中直接使用`os.path.dirname(__file__)`会引发`NameError`,因为`__file__`未定义[^4]。此用法仅适用于实际.py文件。 #### 四、与相关函数对比 | 函数 | 输入示例 | 输出 | 说明 | |------|----------|------|------| | `os.path.dirname` | `/a/b/c.txt` | `/a/b` | 提取目录路径 | | `os.path.split` | `/a/b/c.txt` | (`/a/b`, `c.txt`) | 返回(dirname, basename)元组[^3] | | `os.path.basename` | `/a/b/c.txt` | `c.txt` | 提取文件名 | #### 五、典型应用场景 1. **动态定位资源文件** ```python # 获取当前脚本所在目录下的data.csv路径 data_file = os.path.join(os.path.dirname(__file__), "data.csv") ``` 2. **跨目录模块导入** ```python import sys sys.path.append(os.path.dirname(os.path.dirname(__file__))) # 添加上级目录到PYTHONPATH ``` 3. **安全路径拼接** ```python base_dir = os.path.dirname("/user/docs") safe_path = os.path.join(base_dir, "new_file.txt") # 避免手动拼接路径错误 ``` ### 常见问题解答 **Q1:为什么`os.path.dirname('test.py')`返回空字符串?** A:因为该路径没有目录部分,函数认为文件在当前工作目录。此时返回空字符串表示当前目录[^2]。 **Q2:如何获取多级父目录?** A:嵌套调用函数: ```python path = "/a/b/c/d.txt" parent_dir = os.path.dirname(os.path.dirname(path)) # 得到:/a/b ``` **Q3:路径标准化推荐做法?** A:先使用`os.path.abspath`处理相对路径: ```python abs_path = os.path.abspath("src/main.py") # 转为绝对路径 dir_name = os.path.dirname(abs_path) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值