Python os和os.path模块常用方法小结

1. 前言

这两天因为要完成一个小任务,批量重命名图片。所以就再学习了一下os和os.path模块,发现其中的一些方法很常见且有用,所以就按照判断文件存在性判断、创建文件路径、路径拼接、路径拆分、文件遍历、文件重命名等几个方面进行了归纳总结,方便日后查看。如有不当之处,还请指出。

2. 文件存在性判断

这部分比较简单,通过方法名就可以清晰的知道用法。

  1. os.path.exists(path),如果path存在返回True,反之返回False。
  2. os.path.isfile(path),如果path是文件名返回True,反之返回False。
  3. os.path.isdir(path), 如果path是目录返回True,反之返回False。
  4. os.path.isabs(path), 如果path是绝对路径返回True,反之返回False。
    示列:C:\Users\Jock\Desktop\test_a\2.jpg
>>> os.path.isfile(r'C:\Users\Jock\Desktop\test_a\2.jpg')
True
>>> os.path.isdir(r'C:\Users\Jock\Desktop\test_a\2.jpg')
False
>>> os.path.isdir(r'C:\Users\Jock\Desktop\test_a')
True
>>> os.path.exists(r'C:\Users\Jock\Desktop\test_a')
True
>>> os.path.exists(r'C:\Users\Jock\Desktop\test_a\2.jpg')
True
>>> os.path.isabs(r'C:\Users\Jock\Desktop\test_a\2.jpg')
True

3. 创建文件路径

  1. os.mkdir(path, mode=0o777, *, dir_fd=None),创建路径中的最后一级目录。返回值None.
  2. os.makedirs(name, mode=0o777, exist_ok=False),可以递归创建多级目录。返回值None.
    示例:初始目录r'C:\Users\Jock\Desktop\test_a
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os


path_1 = r'C:\Users\Jock\Desktop\test_a\b'
path_2 = r'C:\Users\Jock\Desktop\test_a\c\d\f'
try:
    os.mkdir(path_1)
    print('创建{}成功'.format(path_1))
    os.mkdir(path_2)
except:
    print('第一次os.mkdir()创建{}失败!'.format(path_2))
    try:
        os.makedirs(path_2)
        print('第二次os.makedirs()创建{}成功!'.format(path_2))
    except:
        print('第二次os.makedirs()创建{}失败!'.format(path_2))

输出:

创建C:\Users\Jock\Desktop\test_a\b成功
第一次os.mkdir()创建C:\Users\Jock\Desktop\test_a\c\d\f失败!
第二次os.makedirs()创建C:\Users\Jock\Desktop\test_a\c\d\f成功!

小结:os.mkdir()创建路径中的最后一级目录,如果上级的目录不存在并且也需要创建的话,就会报错。os.makedirs()创建多级目录,如果上级目录不存在,会自动创建。

4. 路径拼接

os.path.join(path, *paths), 会把path和*paths拼接为一个完整路径返回。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os


path = r'C:\Users\Jock\Desktop\test_a'

print(os.listdir(path))
filelist = os.listdir(path)
for each in filelist:
    path_new = os.path.join(path, each)
    print("文件{}经过os.path.join()拼接后的完整路径名为{}".format(each, path_new))

输出:

['1.jpg', '2.jpg', 'textb']
文件1.jpg经过os.path.join()拼接后的完整路径名为C:\Users\Jock\Desktop\test_a\1.jpg
文件2.jpg经过os.path.join()拼接后的完整路径名为C:\Users\Jock\Desktop\test_a\2.jpg
文件textb经过os.path.join()拼接后的完整路径名为C:\Users\Jock\Desktop\test_a\textb

5. 路径拆分

  1. os.path.split(pathname),把给定的一个路径pathname,以最后一个斜线作为分隔符,返回一个元组, (head, tail),即(头, 尾)的元组。
  • 如果pathname中没有斜线,则head为空;
  • 如果pathname最后以斜线结尾,则tail为空;
  • 如果pathname为空,则head和tail都是空。
  1. os.path.splitdrive(path),返回一个元组,(盘符名, 剩余的路径含文件名)
  2. os.path.splitext(path),返回一个元组, (root, ext),即返回路径+后缀名,ext必须包含.或者为空
    示例:
  3. os.path.basename(path),返回最后一个斜线后面的部分,即返回os.path.split(path)的tail部分。
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os

path = r'C:\Users\Jock\Desktop\test_a\1.jpg'
# path = r'C:\Users\Jock\Desktop\test_a'

print(os.path.split('C:/a/b/c.text'))
print(os.path.split('C:/a/b'))
print(os.path.split('C:/a/'))
print(os.path.split('c.text'))
print(os.path.split(''))

print(os.path.splitdrive(path))
print(os.path.splitext(path))
print(os.path.basename(path))

输出:

('C:/a/b', 'c.text')
('C:/a', 'b')
('C:/a', '')
('', 'c.text')
('', '')
('C:', '\\Users\\Jock\\Desktop\\test_a\\1.jpg')
('C:\\Users\\Jock\\Desktop\\test_a\\1', '.jpg')
1.jpg

6. 文件遍历

  1. os.scandir(path='.'),Python3.5后提供,通过减少os.stat()调用提升速度,通常比os.listdir()快,返回一个包含path路径下所有目录和文件的迭代器。
  2. os.listdir(path='.'),返回一个包含path下所有目录和文件的列表.
  3. os.walk(top, topdown=True, onerror=None, followlinks=False),得到一个三元tupple(dirpath, dirnames, filenames),返回的是一个生成器.
  • dirpath 是一个string,代表起始目录路径,
  • dirnames 是一个list,包含了dirpath下所有子目录的名字(即文件夹名字)
  • filenames 是一个list,包含了dirpath下非目录文件的名字(即所有文件名),这些名字不包含路径信息,如果需要得到全路径,需要使用os.path.join(dirpath,name)得到全路径。
    示例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os

path = r'C:\Users\Jock\Desktop\手机\1'

filelist_1 = os.scandir(path)
filelist_2 = os.listdir(path)
filelist_3 = os.walk(path)

print('os.scandir()返回的类型为:' + str(type(filelist_1)))
print('打印os.scandir(path)结果为:' + str(filelist_1))
print('os.listdir()返回的类型为:' + str(type(filelist_2)))
print('打印os.listdir(path)结果为:' + str(filelist_2))
print('os.walk()返回的类型为:' + str(type(filelist_3)))
print('打印os.walk(path)结果为:' + str(filelist_3))

print('通过for遍历os.scandir()的结果为:')
for i in filelist_1:
    print(i, end=' ')

print()
print('通过for遍历os.listdir()的结果为:')
for i in filelist_2:
    print(i, end=' ')

print()
print('通过for遍历os.walk()的结果为:')
for i in filelist_3:
    print(i)

输出:

os.scandir()返回的类型为:<class 'nt.ScandirIterator'>
打印os.scandir(path)结果为:<nt.ScandirIterator object at 0x0000006283C99940>
os.listdir()返回的类型为:<class 'list'>
打印os.listdir(path)结果为:['1', '10', '2', '3', '4', '5', '6', '7', '8', '9']
os.walk()返回的类型为:<class 'generator'>
打印os.walk(path)结果为:<generator object walk at 0x00000062848FAB88>
通过for遍历os.scandir()的结果为:
<DirEntry '1'> <DirEntry '10'> <DirEntry '2'> <DirEntry '3'> <DirEntry '4'> <DirEntry '5'> <DirEntry '6'> <DirEntry '7'> <DirEntry '8'> <DirEntry '9'> 
通过for遍历os.listdir()的结果为:
1 10 2 3 4 5 6 7 8 9 
通过for遍历os.walk()的结果为:
('C:\\Users\\Jock\\Desktop\\手机\\1', ['1', '10', '2', '3', '4', '5', '6', '7', '8', '9'], [])
('C:\\Users\\Jock\\Desktop\\手机\\1\\1', [], ['10aeafb51acf7b6d7.jpg', '11a3ea555d8ca7e8b.jpg', '1c522c2da3c36757a.jpg', '1cd650c965469dce8.jpg', '1cef3f66b78d0890a.jpg', '1d44bdb1c5e5f709a.jpg', '1db75d79d8a32ba44.jpg', '1dbe080c29fb0aeff.jpg', '1e1ee156f444b6aef.jpg', '1fb7b968a62eb10ef.jpg'])
('C:\\Users\\Jock\\Desktop\\手机\\1\\10', [], ['1a17a03c384cfc78e.jpg', '1a2c208410ae84d1f.jpg', '1a57323b77d9c53e5.jpg', '1ab22cb8d8464e096.jpg', '1abde5c9a60044485.jpg', '1b34c5ccc4c4fd548.jpg', '1b9b78195adbb4bc4.jpg', '1ba3c0a1d956429e2.jpg', '1c16e93d0bf77a31f.jpg'])
('C:\\Users\\Jock\\Desktop\\手机\\1\\2', [], ['1a17a03c384cfc78e.jpg', '1a2c208410ae84d1f.jpg', '1a57323b77d9c53e5.jpg', '1ab22cb8d8464e096.jpg', '1abde5c9a60044485.jpg', '1b34c5ccc4c4fd548.jpg', '1b9b78195adbb4bc4.jpg', '1ba3c0a1d956429e2.jpg', '1c16e93d0bf77a31f.jpg'])
('C:\\Users\\Jock\\Desktop\\手机\\1\\3', [], ['1a17a03c384cfc78e.jpg', '1a2c208410ae84d1f.jpg', '1a57323b77d9c53e5.jpg', '1ab22cb8d8464e096.jpg', '1abde5c9a60044485.jpg', '1b34c5ccc4c4fd548.jpg', '1b9b78195adbb4bc4.jpg', '1ba3c0a1d956429e2.jpg', '1c16e93d0bf77a31f.jpg'])
('C:\\Users\\Jock\\Desktop\\手机\\1\\4', [], ['1a17a03c384cfc78e.jpg', '1a2c208410ae84d1f.jpg', '1a57323b77d9c53e5.jpg', '1ab22cb8d8464e096.jpg', '1abde5c9a60044485.jpg', '1b34c5ccc4c4fd548.jpg', '1b9b78195adbb4bc4.jpg', '1ba3c0a1d956429e2.jpg', '1c16e93d0bf77a31f.jpg'])
('C:\\Users\\Jock\\Desktop\\手机\\1\\5', [], ['1a17a03c384cfc78e.jpg', '1a2c208410ae84d1f.jpg', '1a57323b77d9c53e5.jpg', '1ab22cb8d8464e096.jpg', '1abde5c9a60044485.jpg', '1b34c5ccc4c4fd548.jpg', '1b9b78195adbb4bc4.jpg', '1ba3c0a1d956429e2.jpg', '1c16e93d0bf77a31f.jpg'])
('C:\\Users\\Jock\\Desktop\\手机\\1\\6', [], ['1a17a03c384cfc78e.jpg', '1a2c208410ae84d1f.jpg', '1a57323b77d9c53e5.jpg', '1ab22cb8d8464e096.jpg', '1abde5c9a60044485.jpg', '1b34c5ccc4c4fd548.jpg', '1b9b78195adbb4bc4.jpg', '1ba3c0a1d956429e2.jpg', '1c16e93d0bf77a31f.jpg'])
('C:\\Users\\Jock\\Desktop\\手机\\1\\7', [], ['1a17a03c384cfc78e.jpg', '1a2c208410ae84d1f.jpg', '1a57323b77d9c53e5.jpg', '1ab22cb8d8464e096.jpg', '1abde5c9a60044485.jpg', '1b34c5ccc4c4fd548.jpg', '1b9b78195adbb4bc4.jpg', '1ba3c0a1d956429e2.jpg', '1c16e93d0bf77a31f.jpg'])
('C:\\Users\\Jock\\Desktop\\手机\\1\\8', [], ['1a17a03c384cfc78e.jpg', '1a2c208410ae84d1f.jpg', '1a57323b77d9c53e5.jpg', '1ab22cb8d8464e096.jpg', '1abde5c9a60044485.jpg', '1b34c5ccc4c4fd548.jpg', '1b9b78195adbb4bc4.jpg', '1ba3c0a1d956429e2.jpg', '1c16e93d0bf77a31f.jpg'])
('C:\\Users\\Jock\\Desktop\\手机\\1\\9', [], ['1a17a03c384cfc78e.jpg', '1a2c208410ae84d1f.jpg', '1a57323b77d9c53e5.jpg', '1ab22cb8d8464e096.jpg', '1abde5c9a60044485.jpg', '1b34c5ccc4c4fd548.jpg', '1b9b78195adbb4bc4.jpg', '1ba3c0a1d956429e2.jpg', '1c16e93d0bf77a31f.jpg'])

这个的使用案例可以看我的另外一篇文章Python批量命名某目录下的所有图片名字

7. 文件重命名

  1. os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None),把src重命名为dst, 返回值为None,不支持跨平台。
  2. os.replace(src, dst, *, src_dir_fd=None, dst_dir_fd=None), 把src重命名为dst, 返回值为None,支持跨平台.不过要慎用,因为如果dst存在则会被覆盖掉。会导致误删文件。建议用rename。
  3. os.renames(old, new),递归重命名src为dst。返回值为None。
    具体可以看我的另外一篇Python os.rename()和os.renames()用法的区别

8. 小结

我做了一张思维导图当做小结。
在这里插入图片描述

9. 参考文献

  1. os — 操作系统接口模块
  2. os.path — 常见路径操作
  3. Python中os.mkdir()与os.makedirs()的区别及用法
  4. python 文件和路径操作函数小结
  5. Python批量命名某目录下的所有图片名字
  6. Python os.rename()和os.renames()用法的区别

后记:
我从本硕药学零基础转行计算机,自学路上,走过很多弯路,也庆幸自己喜欢记笔记,把知识点进行总结,帮助自己成功实现转行。
2020下半年进入职场,深感自己的不足,所以2021年给自己定了个计划,每日学一技,日积月累,厚积薄发。
如果你想和我一起交流学习,欢迎大家关注我的微信公众号每日学一技,扫描下方二维码或者搜索每日学一技关注。
这个公众号主要是分享和记录自己每日的技术学习,不定期整理子类分享,主要涉及 C – > Python – > Java,计算机基础知识,机器学习,职场技能等,简单说就是一句话,成长的见证!
每日学一技

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值