携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情
🍁作者简介:🏅云计算领域优质创作者🏅新星计划第三季python赛道TOP1🏅 阿里云ACE认证高级工程师🏅
✒️个人主页:小鹏linux
💊个人社区:小鹏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")! ! ! !
['./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
![点击并拖拽以移动]()
>>> 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”! |
👑👑👑结束语👑👑👑

\