python中的os.path与sys.path

博客主要介绍Python中与路径设置有关的os和sys模块。os模块可完成如创建文件夹、打开文件等操作,sys模块能向运行程序输入变量和环境变量,还能动态改变Python搜索路径,文中还提及了相关常用命令及参考链接。

看别人写的代码,会发现两个和路径设置有关的模块 os 和sys。我对这两个模块也不是特别了解。只是记录一下自己看到的,学到的。
python 中我们会使用这两个模块和文件路径, 创建文件 之类的 操作。
使用ubuntu 操作系统的命令行操作,我们可以 使用命令创建 文件夹,打开文件,文件目录等。 在python 中,导入 os 模块我们也可以完成以上操作。
sys 模块可以向运行的程序中输入 变量,以及环境变量,即程序的搜索路径。

--常用的命令

    import sys
    import os.path
    this_dir = os.path.dirname(__file__)
    sys.path.insert(0, this_dir + '/..')

通过上述代码即首先获取当前目录,使用sys.path将要导入的package或module加入到PATH环境变量中。

1.获取当前目录

        __file__    #是用来获得模块所在的路径的
        os.path.dirname()  ##返回目录路径
 

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

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

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

3.__init__.py 文件
关于__init__
参见:http://www.cnblogs.com/Lands-ljk/p/5880483.html

参考链接:http://blog.youkuaiyun.com/wangjianno2/article/details/48783127
http://www.itcast.cn/news/20160831/1848418827.shtml
os 相关
http://www.jintiankansha.me/weixin/TbTWonY06j

关于下划线:
https://segmentfault.com/a/1190000002611411

<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、付费专栏及课程。

余额充值