python库系列之os和shutil模块

os模块和os.path模块:
os.sep    可以取代操作系统特定的路径分隔符。windows下为 '\\'
os.name    字符串指示你正在使用的平台。比如对于Windows,它是'nt',而对于Linux/Unix用户,它是 'posix'
os.getcwd()    函数得到当前工作目录,即当前Python脚本工作的目录路径
os.getenv()    获取一个环境变量,如果没有返回none
os.putenv(key, value)    设置一个环境变量值
os.listdir(path)    返回指定目录下的所有文件和目录名
os.remove(path)    函数用来删除一个文件
os.system(command)    函数用来运行shell命令
os.linesep    字符串给出当前平台使用的行终止符。例如,Windows使用 '\r\n',Linux使用 '\n' 而Mac使用 '\r'
os.path.split(path)        函数返回一个路径的目录名和文件名
os.path.isfile()    和os.path.isdir()函数分别检验给出的路径是一个文件还是目录
os.path.exists()    函数用来检验给出的路径是否真地存在
os.curdir        返回当前目录 ('.')
os.mkdir(path)    创建一个目录
os.makedirs(path)    递归的创建目录
os.chdir(dirname)    改变工作目录到dirname          
os.path.getsize(name)    获得文件大小,如果name是目录返回0L
os.path.abspath(name)    获得绝对路径
os.path.normpath(path)    规范path字符串形式
os.path.splitext()        分离文件名与扩展名
os.path.join(path,name)    连接目录与文件名或目录
os.path.basename(path)    返回文件名
os.path.dirname(path)    返回文件路径
os.walk(top,topdown=True,onerror=None)        遍历迭代目录
os.rename(src, dst)        重命名file或者directory src到dst 如果dst是一个存在的directory, 将抛出OSError. 在Unix, 如果dst在存且是一个file, 如果用户有权限的话,它将被安静的替换. 操作将会失败在某些Unix 中如果src和dst在不同的文件系统中. 如果成功, 这命名操作将会是一个原子操作 (这是POSIX 需要). 在 Windows上, 如果dst已经存在, 将抛出OSError,即使它是一个文件. 在unix,Windows中有效。
os.renames(old, new)    递归重命名文件夹或者文件。像rename()

先看下我的文件目录结构 
D:\LearnTool\pycode\part1 
在此目录下的文件如下:

abcd.py
demo1.1.py
demo1.2.py
zhang.py
当前运行的文件是abcd.py

1.获取当前文件所在目录 os.path.dirname(“filename”)

import os
#__file__是内置变量,代表的就是当前运行的程序文件
d1=os.path.dirname(__file__)
print(d1)

输出:D:\LearnTool\pycode\part1

使用__file__变量的时候,如果你的程序是在控制台窗口运行的,并且是用的相对路径,例如运行的时候输入:Python abcd.py
那么得到的d1为空字符串,如果用的是绝对路径,例如运行的时候输入:
python D:\LearnTool\pycode\part1\abcd.py
那么d1会正常的显示出来当前文件所在目录。所有谨慎使用!

#另一种方法
import os
d1=os.getcwd()
print(d1)

输出:D:\LearnTool\pycode\part1

注意:其实os.path.dirname()就是返回上级目录的意思,如果传的参数是个文件,那么就返回当前文件所在目录,如果传的参数是个文件目录,那么就返回这个目录的上级目录。

2.获取当前文件的绝对路径 os.path.abspath(“filename”)

import os
d1=os.path.abspath(__file__)
print(d1)

输出:D:\LearnTool\pycode\part1\abcd.py
3.拼接文件目录 os.path.join(path,name)

import os
d1=os.path.dirname(__file__)
d2=os.path.join(d1,"cache")
d3=os.path.join(d1,"cache","hello")
print(d2)
print(d3)

输出:
D:\LearnTool\pycode\part1\cache
D:\LearnTool\pycode\part1\cache\hello
4.获取上级目录

import os
d1=os.path.dirname(__file__)
#这里的..就是表示上级目录
d2=os.path.join(d1,"..")
d3=os.path.abspath(d2)
print(d3)

输出:D:\LearnTool\pycode

#另一种方法
import os
d1=os.getcwd()
d2=os.path.dirname(d1)
print(d2)

输出:D:\LearnTool\pycode
5.查看指定目录下的所有文件 os.listdir(“dirname”)

import os
d1=os.path.dirname(__file__)
#它是以列表的形式返回
d2=os.listdir(d1)
print(d2)

输出:['abcd.py', 'demo1.1.py', 'demo1.2.py', 'demo1.3.py', 'zhang.py']
6.重命名文件 os.rename(“oldname”,”newname”) 
7.删除文件 os.remove(‘filename’) 
8.删除单级目录文件 os.rmdir(‘dirname’)

意思就是你要删除的目录下不能有其他目录,也不可以有其他文件。
9.查看是否是个文件 os.path.isfile(path) 是返回True

import os
print(os.path.isfile(os.path.abspath(__file__)))

输出:True
10.查看是否是个目录 os.path.isdir(path) 是返回True

import os
print(os.path.isdir(os.path.dirname(__file__)))

输出:True
11.查看指定的路径是否存在 os.path.exists(path)

import os
b=os.path.exists("d:\LearnTool\pycode\part1")
print(b)
输出:True
12.获取文件或者目录信息 os.stat(“filename”)

import os
d1=os.path.abspath(__file__)
print(os.stat(d1))

输出:nt.stat_result(st_mode=33206, st_ino=0L, st_dev=0L, st_nlink=0, st_uid=0, st_gid=0, st_size=78L, st_atime=1497404754L, st_mtime=1497404754L, st_ctime=1497404754L)
13.获取当前使用系统平台 os.name

import os
d1=os.name
print(d1)
输出:nt
14.获取系统环境变量 os.environ

import os
d1=os.environ
for key in d1.keys():
    print(key,":",d1[key])

输出:
('TMP', ':', 'C:\\Users\\ZNGK~1\\AppData\\Local\\Temp')
('PYTHONIOENCODING', ':', 'UTF-8')
('COMPUTERNAME', ':', 'HGH8JVHG')
('USERDOMAIN', ':', 'HGH8JVHG')
('VS100COMNTOOLS', ':', 'D:\\LearnTool\\vs2010\\Common7\\Tools\\')
.....
......
输出一大堆,我就不列举了,它是以字典的形式返回的
......
('PUBLIC', ':', 'C:\\Users\\Public')
15.创建单级目录 os.mkdir(path)

import os
os.mkdir("e:\\cs")

这个函数只能创建一级目录,而且参数可以是绝对路径,也可以是相对路径,如果是相对路径,意思就是在程序文件所在目录创建你的目录。
16.创建多级目录 os.makedirs(path)

import os
os.makedirs("e:\\www\dd\\cc")

它和mkdir()区别就是它可以创建多级目录,相对路径和绝对路径都行。
17.拆分路径名 os.path.split()

import os
t1=os.path.split('D:\\LearnTool\\pycode\\part1\\abcd.py')
t2=os.path.split('D:\\LearnTool\\pycode\\part1')
print(t1)
print(t2)
输出:
('D:\\LearnTool\\pycode\\part1', 'abcd.py')
('D:\\LearnTool\\pycode', 'part1')

把一个路径(这里的路径不一定是真实存在的)拆分为两部分,后一部分总是最后级别的目录或文件名。还有一个函数是os.path.splitext()可以直接让你得到文件扩展名,例如:

import os
t1=os.path.splitext('D:\\LearnTool\\pycode\\part1\\abcd.py')
print(t1)

输出:
('D:\\LearnTool\\pycode\\part1\\abcd', '.py')

# shutil 模块
# 循环读取old.txt文件内容并写入到new.txt文件当中
>>> shutil.copyfileobj(open('old.txt','r'), open('new.txt', 'w'))
shutil.copyfile( src, dst)    从源src复制到dst中去。当然前提是目标地址是具备可写权限。抛出的异常信息为IOException. 如果当前的dst已存在的话就会被覆盖掉
shutil.move( src, dst)        移动文件或重命名
shutil.copymode( src, dst)    只是会复制其权限其他的东西是不会被复制的
shutil.copystat( src, dst)    复制权限、最后访问时间、最后修改时间
shutil.copy( src, dst)        复制一个文件到一个文件或一个目录
shutil.copy2( src, dst)        在copy上的基础上再复制文件最后访问时间与修改时间也复制过来了,类似于cp –p的东西
shutil.copy2( src, dst)        如果两个位置的文件系统是一样的话相当于是rename操作,只是改名;如果是不在相同的文件系统的话就是做move操作
shutil.copytree( olddir, newdir, True/Flase)
把olddir拷贝一份newdir,如果第3个参数是True,则复制目录时将保持文件夹下的符号连接,如果第3个参数是False,则将在复制的目录下生成物理副本来替代符号连接
shutil.rmtree( src )    递归删除一个目录以及目录内的所有内容

文件和目录操作

shutil.copyfileobj(fsrc, fdst[, length])
将文件内容拷贝到另一个文件中

>>> import shutil
# 循环读取old.txt文件内容并写入到new.txt文件当中
>>> shutil.copyfileobj(open('old.txt','r'), open('new.txt', 'w'))
>>> import os
# 查看复制过去的文件内容
>>> os.system("cat old.txt new.txt") 
old
old
0

shutil.copyfile(src, dst, *, follow_symlinks=True)
拷贝整个文件,没有第二个文件就创建,有就覆盖

>>> os.system("cat old.txt new.txt")
old
new
0
>>> shutil.copyfile('old.txt', 'new.txt')
# 把第二个文件内容给覆盖了
>>> os.system("cat old.txt new.txt")     
old
old
0

shutil.copymode(src, dst, *, follow_symlinks=True)

仅拷贝文件权限,文件的内容、组、用户均不变

In [9]: ll
total 0
-rw-rw-rw- 1 root 0 Jun  2 15:55 new.txt
-rw-rw-r-- 1 root 0 Jun  2 15:55 old.txt

In [10]: shutil.copymode('old.txt','new.txt') 
# 文件权限都变成644了
In [11]: ll
total 0
-rw-rw-r-- 1 root 0 Jun  2 15:55 new.txt
-rw-rw-r-- 1 root 0 Jun  2 15:55 old.txt

shutil.copystat(src, dst, *, follow_symlinks=True)

拷贝文件状态的信息,文件必须存在,不copy改动时间

>>> os.system("stat old.txt new.txt")  
  文件:'old.txt'
  大小:4               块:8          IO 块:4096   普通文件
设备:801h/2049d        Inode:1835014     硬链接:1
权限:(0664/-rw-rw-r--)  Uid:( 1000/ ansheng)   Gid:( 1000/ ansheng)
最近访问:2016-05-26 15:53:09.813612241 +0800
最近更改:2016-05-26 15:52:54.830640166 +0800
最近改动:2016-05-26 15:52:54.830640166 +0800
创建时间:-
  文件:'new.txt'
  大小:4               块:8          IO 块:4096   普通文件
设备:801h/2049d        Inode:1835024     硬链接:1
权限:(0664/-rw-rw-r--)  Uid:( 1000/ ansheng)   Gid:( 1000/ ansheng)
最近访问:2016-05-26 15:56:22.540041783 +0800
最近更改:2016-05-26 15:54:24.244922722 +0800
最近改动:2016-05-26 15:55:38.353967649 +0800
创建时间:-
0
>>> shutil.copystat('old.txt', 'new.txt')
>>> os.system("stat old.txt new.txt")    
  文件:'old.txt'
  大小:4               块:8          IO 块:4096   普通文件
设备:801h/2049d        Inode:1835014     硬链接:1
权限:(0664/-rw-rw-r--)  Uid:( 1000/ ansheng)   Gid:( 1000/ ansheng)
最近访问:2016-05-26 15:53:09.813612241 +0800
最近更改:2016-05-26 15:52:54.830640166 +0800
最近改动:2016-05-26 15:52:54.830640166 +0800
创建时间:-
  文件:'new.txt'
  大小:4               块:8          IO 块:4096   普通文件
设备:801h/2049d        Inode:1835024     硬链接:1
权限:(0664/-rw-rw-r--)  Uid:( 1000/ ansheng)   Gid:( 1000/ ansheng)
最近访问:2016-05-26 15:53:09.813612000 +0800
最近更改:2016-05-26 15:52:54.830640000 +0800
最近改动:2016-05-26 15:56:48.765143115 +0800
创建时间:-
0

shutil.copy(src, dst, *, follow_symlinks=True)

拷贝文件和状态信息,同样不copy改动时间

>>> os.system("stat old.txt new.txt")  
  文件:'old.txt'
  大小:4               块:8          IO 块:4096   普通文件
设备:801h/2049d        Inode:1835014     硬链接:1
权限:(0664/-rw-rw-r--)  Uid:( 1000/ ansheng)   Gid:( 1000/ ansheng)
最近访问:2016-05-26 15:53:09.813612241 +0800
最近更改:2016-05-26 15:52:54.830640166 +0800
最近改动:2016-05-26 15:52:54.830640166 +0800
创建时间:-
  文件:'new.txt'
  大小:0               块:0          IO 块:4096   普通空文件
设备:801h/2049d        Inode:1835023     硬链接:1
权限:(0664/-rw-rw-r--)  Uid:( 1000/ ansheng)   Gid:( 1000/ ansheng)
最近访问:2016-05-26 15:57:53.448632439 +0800
最近更改:2016-05-26 15:57:53.448632439 +0800
最近改动:2016-05-26 15:57:53.448632439 +0800
创建时间:-
0
>>> shutil.copy2('old.txt', 'new.txt')
>>> os.system("stat old.txt new.txt")  
  文件:'old.txt'
  大小:4               块:8          IO 块:4096   普通文件
设备:801h/2049d        Inode:1835014     硬链接:1
权限:(0664/-rw-rw-r--)  Uid:( 1000/ ansheng)   Gid:( 1000/ ansheng)
最近访问:2016-05-26 15:53:09.813612241 +0800
最近更改:2016-05-26 15:52:54.830640166 +0800
最近改动:2016-05-26 15:52:54.830640166 +0800
创建时间:-
  文件:'new.txt'
  大小:4               块:8          IO 块:4096   普通文件
设备:801h/2049d        Inode:1835023     硬链接:1
权限:(0664/-rw-rw-r--)  Uid:( 1000/ ansheng)   Gid:( 1000/ ansheng)
最近访问:2016-05-26 15:53:09.813612000 +0800
最近更改:2016-05-26 15:52:54.830640000 +0800
最近改动:2016-05-26 15:58:07.938760974 +0800
创建时间:-
0

shutil.ignore_patterns(*patterns)

This factory function creates a function that can be used as a callable for copytree()‘s ignore argument, ignoring files and directories that match one of the glob-style patterns provided. See the example below.

shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False)

递归的去拷贝文件夹

>>> os.system("tree folder1")
folder1
├── dir
├── file.txt
├── sc.pyc
├── tmp
└── vgauthsvclog.txt.0 -> /tmp/vgauthsvclog.txt.0

2 directories, 3 files
0
# folder2目录必须不存在,symlinks=True只copy链接文件,如果等于False就copy源文件,ignore等于不copy的文件或者目录
>>> shutil.copytree('folder1', 'folder2', symlinks=False, ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))   
>>> os.system("tree folder2")
folder2
├── dir
├── file.txt
└── vgauthsvclog.txt.0

1 directory, 2 files
0

shutil.rmtree(path, ignore_errors=False, onerror=None)

递归的去删除文件

>>> os.system("ls -d folder2")
folder2
0
>>> shutil.rmtree('folder2')
>>> os.system("ls -d folder2")
ls: 无法访问'folder2': 没有那个文件或目录
512

shutil.move(src, dst, copy_function=copy2)

递归的去移动文件,它类似mv命令,其实就是重命名

>>> os.system("ls -ld folder1")
drwxrwxr-x 4 ansheng ansheng 4096 5月  26 16:09 folder1
0
>>> shutil.move('folder1', 'folder3')
>>> os.system("ls -ld folder1")      
ls: 无法访问'folder1': 没有那个文件或目录
512
>>> os.system("ls -ld folder3")
drwxrwxr-x 4 ansheng ansheng 4096 5月  26 16:09 folder3
0

shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]])

Create an archive file (such as zip or tar) and return its name.

>>> os.system("ls -dl folder3")
drwxrwxr-x 4 ansheng ansheng 4096 5月  26 16:21 folder3
0
# /home/ansheng/folder3是保存的文件,gztar是后缀名,/home/ansheng/folder3是要打包的路径
>>> shutil.make_archive("/home/ansheng/folder3", 'gztar', root_dir='/home/ansheng/folder3')
# 返回文件打包放在那儿了
'/home/ansheng/folder3.tar.gz'
>>> os.system("ls -dl /home/ansheng/folder3.tar.gz")
-rw-rw-r-- 1 ansheng ansheng 263 5月  26 16:22 /home/ansheng/folder3.tar.gz
0

可选参数如下:

base_name   压缩包的文件名,也可以是压缩包的路径。
format  压缩包种类,“zip”, “tar”, “bztar”,“gztar”
root_dir    要压缩的文件夹路径(默认当前目录)
owner   用户,默认当前用户
group   组,默认当前组

shutil对压缩包的处理是调用ZipFile和TarFile两个模块来进行的.

猜你喜欢

转载自blog.csdn.net/m0_37135615/article/details/81909551