🍁作者简介:🏅云计算领域优质创作者🏅新星计划第三季python赛道TOP1🏅 阿里云ACE认证高级工程师🏅
✒️个人主页:小鹏linux
💊个人社区:小鹏linux(个人社区)欢迎您的加入!
目录
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: 1 Access: Mon Mar 25 17:43:01 2013 Modify: Mon Mar 25 17:43:01 2013 Change: 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 == atime True
获取⽂件权限信息时,别忘了转换成⼋进制。 |
>>> 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(修改)文件的时间。看结果: |
>>> mt 1429580969
还是不友好。下面就用 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.md 02.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.md 03.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.md 0images 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 images 0
这样就列出来了该目录下的所有内容。 需要注意的是, 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换行符问题的原始字符串讲述。比较简单的一个方法用r"c:\user\firfox.exe" 的样式,因为在 r" " 中的,都是被认为原始字符了。还没完,因为 windows 系统中,一般情况下那个文件不是安装在我演示的那个简单样式的文件夹中,而是 C:\Program Files ,这中间还有空格,所以还要注意,空格问题。简直有点晕头转向了。大家按照这些提示,看看能不能完成用 os.system() 启动 firefox 的操作呢? 凡事感觉麻烦的东西,必然有另外简单的来替代。于是又有了一个 webbrowser 模块。可以专门用来打开指定网页。 |
>>> import webbrowser >>> webbrowser.open("http://www.itdiffer.com") True
不管是什么操作系统,只要如上操作就能打开网页了。 真是神奇的标准库,有如此多的工具,能不加速开发进程吗?能不降低开发成本吗?“人生苦短,我用 Python”! |
👑👑👑结束语👑👑👑