在日常编码中,经常与文件路径打交道,对于文件路径的操作中,总是会遇到一些坑,通常是由于没有彻底理解帮助文档的说明
知识点
在使用os模块中关于文件路径等的处理前,先掌握以下一些os变量:
- os.sep - 路径部分之间的分隔符(例如,“ /”或“ \”)
- os.extsep - 文件名和文件“扩展名”之间的分隔符(例如,“ .”)
- os.pardir - 路径组件,意味着将目录树向上遍历一级(例如,“ ..”)
- os.curdir - 引用当前目录的路径组件(例如,“ .”)
os模块的通用方法,包括获取文件路径、查看、删除等
- os.getcwd() 返回当前工作目录
- os.listdir() 返回指定目录下的文件或目录名
- os.remove() 删除指定文件
- os.rmdir(path) 要求目录为空, 否则抛出OSError错误
- os.removedirs() 先删除子目录,再删除父目录,子目录失败,父 目录也失败,类似rmdir,既要求目录为空
- os.mkdir() 创建一个目录
- os.makedirs() 创建多级目录
- os.stat() 返回文件属性,nt.stat_result类型
- os.chdir() 改变当前工作目录
- os.rename(old,new) 重命名
os.path常用方法
- os.path.isfile() 返回指定路径是否为文件,是为true,否为false
- os.path.isdir() 返回指定路径是否为目录,是为true,否为false
- os.path.dirname() 返回指定路径的目录,以最后一个'os.sep'分隔符切分成2部分,返回第1部分
- os.path.basename() 返回指定路径的文件名,以最后一个'os.sep'分隔符切分成2部分,返回第2部分
- os.path.exists() 检查给定路径是否存在,存在true,不存在false
- os.path.split() 以最后一个'os.sep'分隔符切分成2部分,返回元组,例如:
os.path.split('/home/swaroop/byte/code/poem.txt')
结果:('/home/swaroop/byte/code', 'poem.txt')
- os.path.join(),构建新的路径 如果组合的任何参数以os.sep开头,则之前的所有参数都会被丢弃
文件属性:
- os.path.getatime() 返回访问时间
- os.path.getmtime()返回修改时间
- os.path.getctime()返回创建时间
- os.path.getsize()返回文件中的数据量,以字节为单位表示
容易使用错误的方法
os.path.join(),注意构建新的路径时,如果参数以os.sep
开头,则之前的所有参数都会丢弃
例如:
import os.path
PATHS = [
('one', 'two', 'three'),
('/', 'one', 'two', 'three'),
('/', 'one', '/','two', 'three'),
('/one', '/two', '/three'),
('/one/', '/two', 'three'),
]
for parts in PATHS:
print('{} : {!r}'.format(parts, os.path.join(*parts)))
结果为【这里是用windows运行,连接符为“\”】:
('one', 'two', 'three') : 'one\\two\\three'
('/', 'one', 'two', 'three') : '/one\\two\\three'
('/', 'one', '/', 'two', 'three') : '/two\\three'
('/one', '/two', '/three') : '/three'
('/one/', '/two', 'three') : '/two\\three'
os.path.dirname()、os.path.basename() 、os.path.split() 方法有相似之处,均是以最后一个os.sep
分隔符切分成2部分,只是返回不同的部分而已
例如:
import os.path
PATHS = [
'/one/two/three',
'/one/two/three/',
'/',
'.',
'',
]
for path in PATHS:
print('{!r:>17} : {}'.format(path, os.path.split(path)))
结果:
'/one/two/three' : ('/one/two', 'three')
/one/two/three/' : ('/one/two/three', '')
'/' : ('/', '')
'.' : ('', '.')
'' : ('', '')
os.getcwd()与os.path.expanduser('~')
- os.getcwd() 返回当前工作目录
- os.path.expanduser('~') 返回用户主目录(home direction)
例如:
#expanduser()把波浪符(~)转换为用户主目录的名称
for user in ['', 'dhellmann', 'nosuchuser']:
lookup = '~' + user
print('{!r:>15} : {!r}'.format(
lookup, os.path.expanduser(lookup)
))
结果:
注意:如找不到用户的主目录,则返回字符串不变
'~' : 'C:\\Users\\ld'
'~dhellmann' : 'C:\\Users\\dhellmann'
'~nosuchuser' : 'C:\\Users\\nosuchuser'