> 文档中心 > 【python】标准库(第四讲)

【python】标准库(第四讲)

🌍个人简介

      🍁作者简介:大家好,我是姐姐划船吗?运维领域创作者,🏅阿里云ACE认证高级工程师🏅
      ✒️个人主页:姐姐划船吗?
      🕺支持我:点赞👍+收藏⭐️+留言📝
      🫀格言:你未必出类拔萃,但一定与众不同!🔥

💊个人社区:小鹏linux欢迎您的加入!

🧊系列专栏:
               🎒  阶段一:windows基础
               🎒  阶段二:Linux基础知识
               🎒  阶段三:shell基础+shell高级
               🎒  阶段四:学会python,逆天改命
               🎒  阶段五:Linux网络服务
               🎒  阶段六:集群原理及架构
               🎒  阶段七:云计算虚拟化技术

目录

1. tempfifile

2. os.path

3.OS之常⽤函数列表:

4. OS之文件和目录属性

5. OS之操作命令

👑👑👑结束语👑👑👑


1. tempfifile

Python 对临时⽂件的⽀持算是我所⻅过语⾔中最丰富的。通常建议使⽤ NamedTemporaryFile ,其他可以忽略。         • TemporaryFile: 创建临时⽂件对象,关闭时⾃动删除。         • NamedTemporaryFile: 创建临时⽂件对象,可获取⽂件名,参数决定是否⾃动删除。         • SpooledTemporaryFile: 和 TemporaryFile 类似,只有在数据超过阈值时,才写⼊硬盘
>>> import tempfile, os.path>>> tmp = tempfile.NamedTemporaryFile()>>> tmp.name'/var/folders/r2/4vkjhz6s6lz02hk6nh2qb99c0000gn/T/tmpYYB6p3'>>> os.path.exists(tmp.name)True>>> tmp.close()>>> os.path.exists(tmp.name)False
默认使⽤系统临时⺫录和前缀,当然也可以指定不同的配置。
>>> with tempfile.NamedTemporaryFile(prefix = "xxx_", suffix = ".tmp", dir = ".") as f:... print f.name... /Users/yuhen/test/xxx_SL3apY.tmp
与临时⽂件有关的函数还有:         • tempfifile. gettempdir: 返回系统临时⽂件存放路径        • tempfifile. gettempprefifix: 返回默认的临时⽂件名前缀。         • tempfifile. mkdtemp: 创建临时⺫录。         • tempfifile. mkstemp: 创建临时⽂件,返回描述符和⽂件名,需⼿⼯删除。         • os. tempnam: 仅返回有效的临时⽂件名,并不创建⽂件。         • os. tmpfifile(): 创建临时⽂件对象,关闭后⾃动删除。
>>> tempfile.gettempdir()'/var/folders/r2/4vkjhz6s6lz02hk6nh2qb99c0000gn/T'>>> tempfile.gettempprefix()'tmp'
>>> d = tempfile.mkdtemp(); d'/var/folders/r2/4vkjhz6s6lz02hk6nh2qb99c0000gn/T/tmpE_bRWd'>>> os.path.exists(d)True>>> os.removedirs(d)
>>> fd, name = tempfile.mkstemp()>>> os.write(fd, "123\n")4>>> os.close(fd)>>> os.path.exists(name)True>>> os.remove(name)

2. os.path

常⽤函数列表:
函数 说明
abspath 绝对路径。
relpath 相对路径。
realpath 符号链接的真实路径。
normpath 将拼接的路径还原成正常样式。
basename ⽂件名。以 / 结尾的路径,返回空。
dirname 目录名。
commonprefifix        多个路径的共有⽗目录。
exists 判断路径是否存在,失效符号链接返回 False
lexists 判断符号连接⽂件⾃⾝是否存在。
expanduser 展开⽤户根目录  ~ 开始的路径。
expandvars 展开路径中的环境变量。如 : ${name} Windows %name%
getatime 最后访问时间。通常指读操作
getmtime 最后修改时间。
getctime Windows 返回创建时间, Linux 返回属性更新时间。
getsize ⽂件⼤⼩。
isabs 判断是否绝对路径。
isdir 判断是否目录。
isfifile 判断是否⽂件。
islink 判断是否符号链接。
ismount 判断是否载⼊点。
split 将路径分解成 ( 目录 , ⽂件名 )
splitext 将路径分解成 ( 目录 / 主⽂件名,扩展名 )
join 拼接路径。
拼接的目录看上乱糟糟让⼈烦⼼。
>>> os.path.normpath("./../a/b/../c")'../a/c'
展开⽤户根路径,或者包含系统环境变量的路径。
>>> os.path.expanduser("~/.vimrc")'/Users/yuhen/.vimrc'>>> os.path.expandvars("$HOME/.vimrc")'/Users/yuhen/.vimrc'
除⾮只要扩展名,否则还是先⽤ basename 将路径去掉。
>>> os.path.splitext(os.path.basename("/usr/local/lib/libevent.a"))('libevent', '.a')

3.OS之常⽤函数列表:

函数 说明
chdir 修改⼯作目录。
getcwd 获取⼯作目录。
listdir 获取目录下所有成员,不⽀持递归和通配符。
walk 深度遍历所有⼦目录成员。
mkdir 创建⼦目录。如目标已存在,异常。
makedirs 递归创建多级⼦目录。
rmdir 删除空目录。
removedirs             递归删除目录中所有深度⼦目录。如⾮空则抛出异常。
remove  删除⽂件,如果是目录则抛出异常。
rename 重命名。如⺫标目录已存在,抛出异常。如果目标是⽂件,覆盖。
renames 重命名,必要的话会创建目标路径。
chmod 修改权限。 lchmod 修改符号⽂件本⾝。
chown 修改拥有⼈。 lchown 修改符号⽂件本⾝。
access 权限测试。
link 创建符号链接。
symlink 创建符号链接。
readlink 获取符号链接指向的⺫标。
unlink 解除链接。
stat 获取⽂件属性。 lstat 返回符号⽂件本⾝属性。
迭代 walk ,返回 "( 路径,⼦⺫录列表,⽂件列表 )" ,可配合 fnmatch 做通配符过滤。
>>> for path, dirs, files in os.walk("."):... for f in files:... if fnmatch.fnmatch(f, "*.py"):... print os.path.join(path, f)./main.py./bak/amqplib_test.py./bak/eventlet_test.py./bak/extract_text.py./bak/fabric_test.py
如果仅操作当前目录,可以⽤ glob 代替 listdir ,前者⽀持通配符。
>>> glob.glob("./bak/[rs]*.py")! ! ! ! # 迭代器版本: iglob['./bak/redis_test.py', './bak/socket_test.py']
如目录中还有⽂件存在,removedirs 会抛出异常。建议⽤ shutil.rmtree() 代替,注意参数区别。
>>> os.makedirs("./a/b/c")>>> open("./a/b/c/test.txt", "w").write("abc")>>> os.removedirs("./a/b/c")OSError: [Errno 66] Directory not empty: './a/b/c'>>> import shutil>>> shutil.rmtree("./a")
某些时候,需要先测试⽂件是否拥有某些权限。
>>> os.access("a.txt", os.W_OK)True
都是哪些⼈需要修改⽂件时间?
>>> !stat -x a.txt File: "a.txt" Size: 0 FileType: Regular File Mode: (0644/-rw-r--r--) Uid: ( 501/ yuhen) Gid: ( 20/ staff)Device: 1,2 Inode: 5111644 Links: 1Access: Mon Mar 25 17:43:01 2013Modify: Mon Mar 25 17:43:01 2013Change: Mon Mar 25 17:43:01 2013>>> atime = time.mktime(datetime.datetime(2010, 10, 1).utctimetuple())>>> mtime = time.mktime(datetime.datetime(2010, 11, 2).utctimetuple())>>> os.utime("a.txt", (atime, mtime))>>> os.stat("a.txt").st_atime == atimeTrue
获取⽂件权限信息时,别忘了转换成⼋进制。
>>> oct(os.stat("a.txt").st_mode)'0100644'

4. OS之文件和目录属性

不管是在什么操作系统,都能看到文件或者目录的有关属性,那么,在 os 模块中,也有这样的一个方法: os.stat()
>>> p = os.getcwd() #当前目录>>> p'/home/qw/Documents/VBS/StarterLearningPython'# 这个目录的有关信息>>> os.stat(p)posix.stat_result(st_mode=16895, st_ino=4L, st_dev=26L, st_nlink=1, st_uid=0, st_gid=0, st_size=12288L, st_atime=1430224935, st_mtime=1430224935, st_ctime=1430224935)# 指定一个文件>>> pf = p + "/README.md"# 此文件的信息>>> os.stat(pf)posix.stat_result(st_mode=33279, st_ino=67L, st_dev=26L, st_nlink=1, st_uid=0, st_gid=0, st_size=50L, st_atime=1429580969, st_mtime=1429580969, st_ctime=1429580969)
从结果中看,可能看不出什么来,先不用着急。这样的结果是对 computer 友好的,对大家可能不友好.如果用下面的方法,就友好多了:
>>> fi = os.stat(pf)>>> mt = fi[8]
fi[8] 就是 st_mtime 的值,它代表最后 modified(修改)文件的时间。看结果:
>>> mt1429580969
还是不友好。下面就用 time 模块来友好一下:
>>> import time>>> time.ctime(mt)'Tue Apr 21 09:49:29 2015
现在就对大家友好了。 os.stat() 能够查看文件或者目录的属性。如果要修改呢?比如在部署网站的时候,常常要修改目录或者文件的权限等。这种操作在 Python 的 os 模块能做到吗? 要求越来越多了。在一般情况下,不在 Python 里做这个呀。当然,世界是复杂的。肯定有人会用到的,所以 os模块提供了 os.chmod()

5. OS之操作命令

大家如果使用某种 linux 系统,或者曾经用过 dos(恐怕很少),或者再 windows 里面用过 command,对敲 命令都不陌生。通过命令来做事情的确是很酷的。比如,我是在 linux 中,要查看文件和目录,只需要 ls 就 足够了。我并不是否认图形界面,而是在某些情况下,还是离不开命令的,比如用程序来完成查看文件和目录的操作。所以,os 模块中提供了这样的方法,许可程序员在 Python 程序中使用操作系统的命令。(以下是在 linux 系统,如果大家是 windows,可以将命令换成 DOS 命令。)
>>> p'/home/qw/Documents/VBS/StarterLearningPython'>>> command = "ls " + p>>> command'ls /home/qw/Documents/VBS/StarterLearningPython'
为了输入方便,我采用了前面例子中已经有的那个目录,并且,用拼接字符串的方式,将要输入的命令(查看某文件夹下的内容)组装成一个字符串,赋值给变量 command,然后:
>>> os.system(command)01.md 101.md 105.md 109.md 113.md 117.md 121.md 125.md 129.md 201.md 205.md 209.md 213.md 217.md 221.md index.md02.md 102.md 106.md 110.md 114.md 118.md 122.md 126.md 130.md 202.md 206.md 210.md 214.md 218.md 222.md n001.md03.md 103.md 107.md 111.md 115.md 119.md 123.md 127.md 1code 203.md 207.md 211.md 215.md 219.md 2code README.md0images 104.md 108.md 112.md 116.md 120.md 124.md 128.md images 204.md 208.md 212.md 216.md 220.md images0
这样就列出来了该目录下的所有内容。 需要注意的是, os.system() 是在当前进程中执行命令,直到它执行结束。如果需要一个新的进程,可以使用 os.exec 或者 os.execvp 。对此有兴趣详细了解的兄弟,可以查看帮助文档了解。另外, os.system() 是通过shell 执行命令,执行结束后将控制权返回到原来的进程,但是 os.exec() 及相关的函数,则在执行后不将控 制权返回到原继承,从而使 Python 失去控制。 关于 Python 对进程的管理,此处暂不过多介绍。 os.system() 是一个用途不少的函数。曾有一个朋友网上询问,用它来启动浏览器。不过,这个操作的确要非常仔细。为什么呢?演示一下就明白了。
>>> os.system("/usr/bin/firefox")(process:4002): GLib-CRITICAL **: g_slice_set_config: assertion 'sys_page_size == 0' failed(firefox:4002): GLib-GObject-WARNING **: Attempt to add property GnomeProgram::sm-connect after class was initialised......
我是在 linux上操作的,浏览器的地址是 /usr/bin/firefox ,可是,那个朋友是 windows,他就要非常小心了,因为在 windows 里面,表示路径的斜杠是跟上面显示的是反着的,可是在 Python 中 \ 这种斜杠代表转 义。解决这个问题可以参看我之前写的一篇文章 【python】OS模块的用法及python换行符问题_姐姐划船吗?的博客-CSDN博客 的原始字符串讲述。比较简单的一个方法用r"c:\user\firfox.exe" 的样式,因为在 r" " 中的,都是被认为原始字符了。还没完,因为 windows 系统中,一般情况下那个文件不是安装在我演示的那个简单样式的文件夹中,而是 C:\Program Files ,这中间还有空格,所以还要注意,空格问题。简直有点晕头转向了。大家按照这些提示,看看能不能完成用 os.system() 启动 firefox 的操作呢? 凡事感觉麻烦的东西,必然有另外简单的来替代。于是又有了一个 webbrowser 模块。可以专门用来打开指定网页。
>>> import webbrowser>>> webbrowser.open("http://www.itdiffer.com")True
不管是什么操作系统,只要如上操作就能打开网页了。 真是神奇的标准库,有如此多的工具,能不加速开发进程吗?能不降低开发成本吗?“人生苦短,我用 Python”!

👑👑👑结束语👑👑👑

 

英语听力