os 模块和 shutil 模块
一、文件路径相关(os)
1、当前脚本及路径
# -*- coding: utf-8 -*-
import os
import sys
# 获取当前脚本所在的目录
os.getcwd() # 绝对路径
os.curdir # 相对路径
os.path.abspath(os.curdir)
os.path.realpath(os.curdir)
sys.path[0] # 绝对路径
# 获取当前脚本的路径
# 若用绝对路径调用就返回绝对路径,相对路径调用就返回相对路径
__file__
# 若用绝对路径调用就返回绝对路径,相对路径调用就返回相对路径
sys.argv[0]
# 如果是打包成 exe,获取当前 exe 的路径
sys.executable
2、遍历目录
(1)os.listdir()
path = r'e:\python_newdemo\20190611'
# 返回指定目录下的所有文件和目录名;
os.listdir(path) # ['2', '5', '9', 'abc.txt']
(2)os.walk()
#遍历 os.walk() 返回的对象,有三个:
# ①、需要遍历的路径;
# ②、该路径下的所有目录名,list 对象;
# ③、该路径下的所有文件名,list 对象;
print('walk')
for dst_path, dirs, files in os.walk(path):
print('dst_path : ' + dst_path)
print('dirs : ' + str(dirs))
print('files : ' + str(files))
print('')
3、路径及文件名的获取
# 以此例子说明
path = r'e:\python_newdemo\20190611\abc.txt'
(1)os.path.split()
# 将路径分割成两部分,返回结果是一个 tuple。tuple 的第二个元素时路径的最后一部分,第一个元素时之前的所有信息。
# 当输入参数是 os.sep 结尾时,路径的最后一个元素就是空字符串。
os.path.split(path) # ('e:\\python_newdemo\\20190611', 'abc.txt')
(2)os.path.dirname()
# 获取路径名,也可对一个路径多次用每次少一级,即 os.path.split() 的第一部分;
os.path.dirname(path) # e:\python_newdemo\20190611
(3)os.path.basename()
# 获取文件名,即 os.path.split() 的第二部分;
os.path.basename(path) # abc.txt
(4)os.path.splitext()
# 以元组的形式分离扩展名;
os.path.splitext(path) # ('e:\\python_newdemo\\20190611\\abc', '.txt')
os.path.splitext(os.path.basename(path)) # ('abc', '.txt')
(5)os.path.realpath() 和 os.path.abspath()
# os.path.realpath() 返回真实路径,可能存在软链的情况
# 其他情况跟 os.path.abspath() 一样,返回的是绝对路径
# 在 linux 中测试的例子
os.path.realpath('/usr/bin/python') # '/usr/bin/python2.7'
os.path.abspath('/usr/bin/python') # '/usr/bin/python'
(6)os.path.commonprefix(paths) 和 os.path.commonpath(paths)
# 获取多个路径的公共前缀
paths = ['/one/two/three/four',
'/one/two/threefold',
'/one/two/three/',]
# 不考虑路径分隔符,可能是一个不存在的路径
os.path.commonprefix(paths) # /one/two/three
# 充分考虑路径分隔符,返回路径序列中各个部分的最长公共有效子路径
os.path.commonpath(paths) # \one\two
(7)os.path.expanduser()
# 把波浪号(~)转化为用户主目录
for user in ['', 'dhellmann', 'nosuchuser']:
lookup = '~' + user
print('{!r:>15} : {!r}'.format(lookup, os.path.expanduser(lookup)))
(8)os.path.normpath()
# 使用 join() 或者嵌入变量的独立字符串组合的路径结尾可能有额外的路径分隔符或者相对路径组件。使用 normpath() 来清理。
PATHS = ['one//two//three',
'one/./two/./three',
'one/../alt/two/three', ]
for path in PATHS:
print('{!r:>22} : {!r}'.format(path, os.path.normpath(path)))
4、判断
# 如果 path 是一个存在的路径(文件或目录都可以)就返回 True,否则返回 False
os.path.exists()
# 检验给出的路径是否是一个文件
os.path.isfile()
# 检验给出的路径是否是一个目录
os.path.isdir()
# 判断是否是绝对路径
os.path.isabs()
5、其他
(1)python 平台执行 shell 命令
# 运行 shell 命令
os.system("bash command")
# 运行 shell 命令,生成对象可赋给变量再用 read 读取
os.popen("bash command")
(2)Windows 平台和 Linux 平台不一样的
# 给出当前平台使用的行终止符;Windows 使用'\r\n',Linux使用'\n',而Mac使用'\r'
os.linesep
# 指示你正在使用的平台;Windows是‘nt’,而对于Linux/Unix用户,是‘posix’
os.name
# 输出操作系统特定的路径分隔,windows下为“\\”,linux下为“/”
os.sep
(3)Linux 中权限修改
# 修改文件权限与时间戳,类似 linux 中 chmod 命令
os.chmod(path, mod:int):
# 修改文件的 owner,类似 linux 中 chown 命令
os.chown(path, uid:int, gid:int):
(4)读取和设置环境变量
os.getenv()
os.putenv()
(5)其他
# 获取文件属性
os.stat(file):
# 获取文件大小
os.path.getsize(filename):
# 当前路径
os.curdir # .
# 上一级路径
os.pardir # ..
二、文件和目录的修改
1、新建文件或目录(os)
# 创建空文件,但是 Windows 下的 Python 不支持此操作,Windows中用写的方式 open 一个文件就可以了
os.mknod('test.txt')
# 创建多级目录
os.makedirs()
# 创建单个目录
os.mkdir()
2、重命名文件或目录(os)
# 可以单个重命名文件或者目录
os.rename('oldname', 'newname')
# 多级目录的重命名
os.renames('oldnames', 'newnames')
3、复制文件或者目录(shutil)
# 复制文件,oldfile 和 newfile 都只能是文件
shutil.copyfile('oldfile', 'newfile')
# 复制文件,oldfile 只能是文件,newfile可以是文件或者目录
shutil.copy('oldfile', 'newfile')
# 在 copy 的基础上再复制文件最后访问时间和修改时间,其他情况也类似 move 操作
shutil.copy2('oldfile', 'newfile')
# 复制文件夹,olddir 和 newdir 都只能是目录,且 newdir 必须不存在
shutil.copytree('olddir', 'newdir')
# 只会复制其权限,其他东西不会被复制;linux 中使用,Windows 没什么意义
shutil.copymode('old', 'new')
# 复制权限,最后访问时间,最后修改时间;linux 中使用,Windows 没什么意义
shutil.copystat('old', 'new')
4、移动(shutil)
# 移动文件或目录,把 old 移动到 new
# 如果 old 和 new 都是文件的话:old 的内容会覆盖 new 的内容,新文件就是 old 的内容和 new 的文件名
shutil.move('old', 'new')
5、删除文件或者目录
(1)os 中
# 删除单个文件
os.remove('file')
# 删除单个目录,只能是空目录
os.rmdir('dir')
# 删除多级目录,只能是空目录
os.removedirs('dir')
(2)shutil 中
# 递归删除所有,空目录和有文件的目录都可以删,但传参必须是目录,不能是文件
shutil.rmtree('dir')
# 如果ignore_errors=True,清除失败导致的错误将会被忽略;
# 如果ignore_errors=False,清除失败时将会调用由onerrors指定的程序来处理此类错误;
# 如果忽略这一参数设定,清除失败时将会弹出一个exception。