import os总结

本文深入讲解了Python中os.path模块的常用方法,包括获取绝对路径、拆分路径、判断路径有效性等,并通过实例演示如何使用这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在看死磕yolo开源项目,之前没有做过相关的,所以,每一个句代码都要死磕,碰到import os 所以记录一下假装自己学过... .. .

其实我主要还是在造轮子咯

主要是参考下面这个博客:https://www.cnblogs.com/wuxie1989/p/5623435.html

还有官方文档:http://docs.python.org/library/os.path.html

首先我的实验目录在这里

一、os.path.abspath(path)

返回path的绝对路径

>>> os.path.abspath("train.py")
'E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master\\train.py'

二、os.path.split(path)

将path分割成目录和文件名并以元组方式返回

>>> os.path.split("E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master\\train.py")
('E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master', 'train.py')
>>> os.path.split("E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master")
('E:\\my_project\\darknet\\darknet-master\\keras-yolo3', 'keras-yolo3-master')
>>> os.path.split("E:\\my_project\\darknet\\darknet-master\\keras-yolo3")
('E:\\my_project\\darknet\\darknet-master', 'keras-yolo3')
>>> os.path.split("E:\\my_project\\darknet\\darknet-master")
('E:\\my_project\\darknet', 'darknet-master')
>>> os.path.split("E:\\my_project\\darknet")
('E:\\my_project', 'darknet')
>>> os.path.split("E:\\my_project")
('E:\\', 'my_project')
>>> os.path.split("E:")
('E:', '')

三、os.path.dirname(path)

返回path的目录,其实就是返回os.path.split(path)元组的第一个元素

>>> os.path.dirname("E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master\\train.py")
'E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master'
>>> os.path.dirname("E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master")
'E:\\my_project\\darknet\\darknet-master\\keras-yolo3'
>>> os.path.dirname("E:\\my_project\\darknet\\darknet-master\\keras-yolo3")
'E:\\my_project\\darknet\\darknet-master'
>>> os.path.dirname("E:\\my_project\\darknet\\darknet-master")
'E:\\my_project\\darknet'
>>> os.path.dirname("E:\\my_project\\darknet")
'E:\\my_project'
>>> os.path.dirname("E:\\my_project")
'E:\\'

四、os.path.basename(path)

返回path的文件名,其实就是返回os.path.split(path)元组的第二个元素

>>> os.path.basename("E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master\\train.py")
'train.py'
>>> os.path.basename("E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master")
'keras-yolo3-master'
>>> os.path.basename("E:\\my_project\\darknet\\darknet-master\\keras-yolo3")
'keras-yolo3'
>>> os.path.basename("E:\\my_project\\darknet\\darknet-master")
'darknet-master'
>>> os.path.basename("E:\\my_project\\darknet")
'darknet'
>>> os.path.basename("E:\\my_project")
'my_project'

五、osa.path.commonprefix(list)

list里面每一个元素都是一个路径,然后这个函数返回路径中的公共路径

>>> list = ["E:\\my_project","E:\\my_project\\darknet","E:\\my_project\\darknet\\darknet-master"]
>>> os.path.commonprefix(list)
'E:\\my_project'

六、os.path.exists(path)

如果path是一个存在的路径,返回True,否则(otherwise) 返回 False

>>> os.path.exists("E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master\\train.py")
True
>>> os.path.exists("E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master")
True
>>> os.path.exists("E:\\my_project\\darknet\\darknet-master\\keras-yolo3")
True
>>> os.path.exists("E:\\my_project\\darknet\\darknet-master")
True
>>> os.path.exists("E:\\my_project\\darknet")
True
>>> os.path.exists("E:\\my_project")
True
>>> os.path.exists("train.py")
True

下面并不存在这个文件路径,输出为False

>>> os.path.exists("E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master\\train.txt")
False
>>> os.path.exists("train.txt")
False

应用六:判断路径是否存在,不存在则创建:

log_dir = "logs/"
if not os.path.exists(log_dir):
    os.makedirs(log_dir)

七、os.path.isabs(path)

如果路径path是绝对路径返回True,否则(otherwise)返回False

>>> os.path.isabs("E:\\my_project\\darknet\\darknet-master")
True
>>> os.path.isabs("E:\\my_project\\darknet\\darknet-master\\keras-yolo3")
True
>>> os.path.isabs("E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master\\train.py")
True

下面不是绝对路径,输出为False

>>> os.path.isabs("train.py")
False

八、os.path.isfile(path)

如果path是一个存在的文件,返回True,否者(otherwise)返回False

>>> os.path.isfile("E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master\\train.py")
True
>>> os.path.isfile("train.py")
True

下面是一个不存在的文件

>>> os.path.isfile("train.txt")
False

看下面没有文件的,输出全是False

>>> os.path.isfile("E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master")
False
>>> os.path.isfile("E:\\my_project\\darknet\\darknet-master\\keras-yolo3")
False
>>> os.path.isfile("E:\\my_project\\darknet\\darknet-master")
False
>>> os.path.isfile("E:\\my_project\\darknet")
False
>>> os.path.isfile("E:\\my_project")
False

九、os.path.isdir(path)

如果path里面存在目录,返回True,否则返回False

>>> os.path.isdir("E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master\\train.py")
False
>>> os.path.isdir("E:\\my_project\\darknet")
True
>>> os.path.isdir("E:\\my_project\\darknet\\darknet-master")
True
>>> os.path.isdir("E:\\my_project\\darknet\\darknet-master\\keras-yolo3")
True
>>> os.path.isdir("E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master")
True

十、os.path.join(path[,path2[,...])

组合多个路径并返回

>>> os.path.join("E:\\my_project","darknet\\darknet-master","darknet-master\\keras-yolo3","keras-yolo3-master\\train.py")
'E:\\my_project\\darknet\\darknet-master\\darknet-master\\keras-yolo3\\keras-yolo3-master\\train.py'

利用os.getcwd()获取当前路径并组合返回

>>> os.getcwd()
'E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master'
>>> os.path.join(os.getcwd(),'train.py')
'E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master\\train.py'

十一、os.path.splitdrive(path)

返回(drivename,fpath)的元组,也就是将驱动磁盘和文件路径split一下返回元组

>>> os.path.splitdrive("E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master\\train.py")
('E:', '\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master\\train.py')

下面利用安装在D盘的anacoda路径进行测试一下

>>> os.path.splitdrive("D:\\software1\\anacoda3")
('D:', '\\software1\\anacoda3')

 

十二、os.splitext(path)

 

分离扩展名然后按照元组返回

>>> os.path.splitext("E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master\\train.py")
('E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master\\train', '.py')

十三、os.path.getsize(path)

返回path文件的字节大小,可以传入绝对路径和相对路径

>>> os.getcwd()
'E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master'
>>> os.path.getsize("train.py")
6478
>>> os.path.getsize("E:\\my_project\\darknet\\darknet-master\\keras-yolo3\\keras-yolo3-master\\train.py")
6478

十四、os.walk(path) 

os.walk返回的是一个生长器,需要使用next()获取,最后next()获取返回一个元组,第一个元素一般是当前相对路径,第二个元素一般是文件夹的名字,第三个元素一般是文件的名字,在一些文件夹和文件共存的文件夹内操作比较方便。和os.listdir相比就是后者将文件夹内所有子文件夹和文件以列表返回,看例子

 samples文件夹和文件如下

li_haiyu@come-on:/media/li_haiyu/E/Mask_RCNN-master/samples$ python
Python 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 18:10:19) 
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.getcwd()
'/media/li_haiyu/E/Mask_RCNN-master/samples'
>>> next(os.walk("./"))
('./', ['shapes', 'balloon', '.ipynb_checkpoints', 'coco', 'nucleus'], ['2.cpp', 'test', 'demo.ipynb', '1.py'])
>>> next(os.walk("./"))[2]
['2.cpp', 'test', 'demo.ipynb', '1.py']
>>> os.listdir("./")
['shapes', '2.cpp', 'test', 'balloon', '.ipynb_checkpoints', 'demo.ipynb', 'coco', '1.py', 'nucleus']
>>> 

提醒:

我觉的应该注意一下的就是os.path.exists(path)和os.path.isfile(path),前者是判断路径是否存在,后者是判断该文件是否存在

The end.

更多请参考:https://www.cnblogs.com/wuxie1989/p/5623435.html & http://docs.python.org/library/os.path.html

彩蛋:import Image 总结

2019.4.26 add.

判断文件夹心是否存在,存在递归删除之

import shutil
import os
path = os.path.join(os.getcwd(),'test')
if os.path.isdir(path):
    shutil.rmtree(path)
    print("test dir is removed!!!")

 

 

 

 

 

<think>嗯,用户想了解Python中的os和shutil模块的功能和使用方法。首先,我需要回忆这两个模块的主要作用。os模块主要用于和操作系统交互,处理文件和目录的基本操作,比如创建、删除、重命名,以及获取路径信息等。而shutil模块则更偏向于高级文件操作,比如复制、移动、删除整个目录,还有压缩解压功能。 接下来,我需要整理它们的常用函数。对于os模块,常用的有os.getcwd()获取当前目录,os.listdir()列出目录内容,os.mkdir()创建目录,os.rename()重命名文件或目录,os.remove()删除文件,还有os.path子模块处理路径相关的问题。比如os.path.join()可以跨平台拼接路径,os.path.exists()检查路径是否存在。 然后是shutil模块,shutil.copy()复制文件,shutil.copytree()复制整个目录树,shutil.rmtree()删除目录及其内容,shutil.move()移动文件或目录。还有shutil.make_archive()和shutil.unpack_archive()处理压缩和解压。这些都是用户可能会用到的功能。 用户可能还会想知道两者的区别,比如os模块处理基础操作,而shutil处理更复杂的任务。比如复制单个文件用os也可以,但shutil.copy()更方便,还能保留元数据。移动文件的话,shutil.move()比os.rename()更强大,可以跨设备移动。 然后需要举一些例子,比如使用os.walk遍历目录树,这在处理大量文件时很有用。shutil的copytree和rmtree在处理目录时更高效,避免手动递归操作。还要注意异常处理,比如在删除文件前检查是否存在,避免程序崩溃。 用户可能的应用场景包括批量处理文件,自动化备份,或者清理临时文件。比如用shutil做定期备份,压缩日志文件,或者用os模块整理下载文件夹中的文件。 另外,需要提醒用户注意不同操作系统之间的路径差异,使用os.path模块来处理可以保证跨平台兼容性。还有权限问题,比如删除文件时是否有足够的权限,可能会引发异常,需要适当处理。 最后,结合用户提供的引用内容,引用[1]提到os和shutil的重要性,引用[2]说明shutil的高级处理功能,引用[3]给出复制文件的例子,引用[4]提到os.walk的遍历功能。这些都需要整合到回答中,确保引用正确。 总结一下,回答的结构应该先介绍两个模块的总体功能,然后分别详细列出常用函数和示例代码,比较它们的区别,最后给出应用场景和注意事项。确保使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$,虽然这里可能用不上数学公式,但如果有变量或代码中的符号可能需要用到。同时生成相关问题,帮助用户进一步学习。</think>### Python os 和 shutil 模块功能解析 #### 一、核心功能对比 | 模块 | 功能定位 | 典型应用场景 | 核心区别 | |--------|-------------------|---------------------------|------------------------------| | `os` | 基础系统交互 | 目录遍历、路径操作 | 提供操作系统底层接口 | | `shutil` | 高级文件操作 | 文件复制、压缩打包 | 封装复杂文件操作逻辑 | #### 二、os 模块核心功能 1. **路径操作** - `os.path` 子模块实现跨平台路径处理: ```python full_path = os.path.join('dir', 'subdir', 'file.txt') # 路径拼接 is_exists = os.path.exists('/tmp/test') # 存在性校验 ``` 2. **目录管理** - 创建/删除目录: ```python os.mkdir('new_dir') # 单层创建 os.makedirs('a/b/c', exist_ok=True) # 递归创建 os.rmdir('empty_dir') # 删除空目录 ``` 3. **文件元数据** - 获取文件信息: ```python file_stats = os.stat('data.txt') print(f"最后修改时间: {file_stats.st_mtime}") ``` 4. **环境控制** - 系统变量操作: ```python os.environ['TEMP_DIR'] = '/tmp' # 设置环境变量 ``` #### 三、shutil 模块高级操作 1. **文件复制**(保留元数据) ```python shutil.copy2('src.txt', 'dst.txt') # 包括权限和时间戳 ``` 2. **目录树操作** ```python shutil.copytree('src_dir', 'backup_dir') # 递归复制 shutil.rmtree('temp_dir') # 强制删除非空目录 ``` 3. **压缩处理**(支持zip/tar格式) ```python shutil.make_archive('logs_2023', 'zip', 'log_dir') # 创建压缩包 shutil.unpack_archive('data.tar.gz', 'extract_dir') # 解压文件 ``` 4. **磁盘空间检测** ```python usage = shutil.disk_usage('/') print(f"可用空间: {usage.free/1e9:.2f} GB") ``` #### 四、联合应用实例 ```python import os import shutil def organize_downloads(): """自动分类下载目录文件""" download_path = os.path.expanduser('~/Downloads') # 创建分类目录 categories = {'Documents': ['.pdf', '.doc'], 'Images': ['.jpg', '.png']} for folder in categories: os.makedirs(os.path.join(downloads_path, folder), exist_ok=True) # 遍历并分类文件 for filename in os.listdir(download_path): src_path = os.path.join(download_path, filename) if os.path.isfile(src_path): ext = os.path.splitext(filename)[1].lower() for category, exts in categories.items(): if ext in exts: dest_dir = os.path.join(download_path, category) shutil.move(src_path, dest_dir) break ``` #### 五、关键注意事项 1. **异常处理规范** ```python try: shutil.rmtree('important_dir') except FileNotFoundError: print("目录不存在") except PermissionError: print("权限不足") ``` 2. **性能优化技巧** - 使用`shutil.copyfileobj()`处理大文件 - 用`os.scandir()`替代`os.listdir()`提升遍历效率 §§ 相关问题 §§ 1. [文件权限管理] 如何用os模块修改文件权限? → 可通过`os.chmod(path, 0o755)`设置权限模式 2. [跨平台兼容] Windows和Linux路径处理有何差异? → 使用`os.path`模块始终返回当前系统的正确路径分隔符 3. [高级应用] 如何实现增量文件同步? → 结合`os.stat()`的st_mtime属性和shutil.copy2() 4. [异常排查] 处理`shutil.Error`异常的最佳实践? → 该异常会聚合多个文件操作错误,建议结合error_log属性记录详细错误信息[^2] [^1]: os模块提供操作系统底层接口 [^2]: shutil模块封装高级文件操作逻辑 [^3]: 文件复制保留元数据的实现方式 [^4]: 目录遍历的高效实现方法
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值