Python中大多数系统级接口都集中在两个模块: sys和os———《Programming Python》
一、OS模块
用于提供系统级别的操作。
OS
目录和文件
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: ('.')
os.pardir 获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2') 可生成多层递归目录
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() 删除一个文件
os.rename("oldname","newname") 重命名文件/目录
os.stat('path/filename') 获取文件/目录信息
路径相关
os.path.abspath(path) 返回path规范化的绝对路径
os.path.split(path) 将path分割成目录和文件名二元组返回
os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是绝对路径,返回True
os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
系统相关
os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command") 运行shell命令,直接显示
os.environ 获取系统环境变量
1.
os.path.isdir,
os.path.isfile,
os.exists,
os.path.getsize
顾名思义,这是用来查看路径/文件是否存在的,getsize可以获取文件大小(kb)
>>> import os >>> os.path.isdir(r'F:\python程序') #如果path是一个存在的目录,则返回True。否则返回False True >>> os.path.getsize(r'F:\python程序')#返回文件夹"F:\python程序"的大小 12288 >>> os.path.exists(r'F:\python程序\导入路径研究')#如果path存在,返回True;如果path不存在,返回False True >>> os.path.isfile(r'F:\python程序\导入路径研究\test.py')#如果path是一个存在的文件,返回True。否则返回False True
>>>
- os.path.split
- os.path.join
- os.path.dirname
- os.path.basename
- 这些方法主要是对一个路径进行具体处理,默认按照dirname, basename的方式进行分解或组合
-
>>> os.path.split(r'F:\python程序\导入路径研究\test.py')#将path分割成目录和文件名二元组返回 ('F:\\python程序\\导入路径研究', 'test.py') >>> a=os.path.split(r'F:\python程序\导入路径研究\test.py') >>> print(a) ('F:\\python程序\\导入路径研究', 'test.py') >>> os.path.join(*a) #将多个路径组合后返回 'F:\\python程序\\导入路径研究\\test.py' >>> file_loc=r'F:\python程序\导入路径研究\test.py' >>> os.path.dirname(file_loc)#返回path的目录。 'F:\\python程序\\导入路径研究' >>> os.path.basename(file_loc)#返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。 'test.py'
可以看出:os.path.split与os.path.join是正好相反的功能,一个是分割,一个是组合
>>> pathname=r'F:\python程序\导入路径研究\test.py' >>> pathname.split(os.sep) ['F:', 'python程序', '导入路径研究', 'test.py'] >>> os.sep.join(pathname.split(os.sep)) 'F:\\python程序\\导入路径研究\\test.py'
############os.sep的用法###########
python是跨平台的。在Windows上,文件的路径分隔符是'\',在Linux上是'/'。
为了让代码在不同的平台上都能运行,那么路径应该写'\'还是'/'呢?
使用os.sep的话,就不用考虑这个了,os.sep根据你所处的平台,自动采用相应的分隔符号。3.注意
os
模块下的os.path.normpath
也很好用,可以用来规范一个路径>>> os.path.normpath('F:\python程序\导入路径研究\test.py') 'F:\\python程序\\导入路径研究\test.py'
4.os.path.abspath根据传入的相对/绝对路径返回对应的绝对路径
1 import os 2 3 print(os.path.abspath(".")) #当前目录的绝对路径 4 print(os.path.abspath(r".")) 5 6 print(os.path.abspath("..")) 7 print(os.path.abspath(r"..")) #上级目录的绝对路径 8 9 10 print(os.path.abspath(r"F:/python程序/导入路径研究/abspath功能.py")) 11 print(os.path.abspath(r"F:/python程序/导入路径研究/abspath功能.py"))
从输出结果看不出参数"r"的功能
二、SYS模块
用于提供对解释器相关的操作
sys.argv 命令行参数List,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(0),异常为exit(1)
sys.version 获取Python解释程序的版本信息
sys.maxint 最大的Int值
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
sys.stdout.write('please:')
val = sys.stdin.readline()[:-1]
1.相对路径和绝对路径
绝对路径就是文件的真正存储的路径,如:C:\Users\lenovo\Desktop
相对路径就是以当前文件为基准一级级目录指向被引用的资源文件。
以下是常用的表示当前目录和当前目录的父级目录的标识符
../ 表示当前文件所在的目录的上一级目录
./ 表示当前文件所在的目录(可以省略) / 表示当前站点的根目录(域名映射的硬盘目录)
1 import os 2 path1=os.path.abspath('.') # 表示当前所处的文件夹的绝对路径 3 print(path1) 4 path2=os.path.abspath('..') # 表示当前所处的文件夹上一级文件夹的绝对路径 5 print(path2)
结果如下:
>>>
==================== RESTART: F:/python程序/导入路径研究/listdir.py ===================
F:\python程序\导入路径研究
F:\python程序
>>>
2.Python sys.path的使用
sys.path模块是动态的修改系统路径
因为模块要处于Python搜索路径中的目录里才能被导入,(但我们不喜欢维护一个永久性的大目录,因为其他所有的Python脚本和应用程序导入模块的时候性能都会被拖累。)因此当某一目录存在而且此前不在sys.path时,我们可以用sys.path动态地在路径中添加一个"目录"。
sys.path是个列表,所以在末尾添加目录是很容易的,用sys.path.append就行了。当这个append执行完之后,新目录即时起效,以后的每次import操作都可能会检查这个目录。当然我们也可以选择用sys.path.insert(0,…,这样新添加的目录会优先于其他目录被import检查。
sys.path.append(‘你的模块路径名称’)。
sys.path.insert(0,’模块的名称’)
添加相关的路径,但在退出python环境后自己添加的路径就会自动消失!
1 import sys 2 sys.path.append('F:\python程序\导入路径研究') #sys.path是个列表,用sys.path.append可以在末尾添加目录。
1 import sys 2 sys.path.insert(0,'F:\python程序\导入路径研究')#用sys.path.insert新添加的目录会优先于其他目录被import检查到。
3.python 在不同层级目录import 模块的方法
有一个文件夹/home/a, 里面有个模块叫b.py, 我怎么把他import到程序里?
方法一:
import sys;
sys.path.append(“/home/a/”)
import b
方法二:
在目录里面增加__init__.py文件,里面可以写import时执行的代码,当然也可以留空就可以.
import home.a.b
方法三:
from home.a.b import *
前提 home、a中都包括__init__.py 即:要导入的文件的当前目录和父目录都要有init.py文件
Python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的路径。
下面将具体介绍几种常用情况:
(1)主程序与模块程序在同一目录下:
如下面程序结构:
– src
|– mod1.py
|– test1.py
若在程序test1.py中导入模块mod1, 则直接使用import mod1或from mod1 import *;
(2)主程序所在目录是模块所在目录的父(或祖辈)目录
如下面程序结构:
– src
|– mod1.py
|– mod2
| – mod2.py
– test1.py
若在程序test1.py中导入模块mod2, 需要在mod2文件夹中建立空文件__init__.py文件(也可以在该文件中自定义输出模块接口); 然后使用 from mod2.mod2 import * 或import mod2.mod2.
(3)主程序导入上层目录中模块或其他目录(平级)下的模块
如下面程序结构:
– src
|– mod1.py
|– mod2
|– mod2.py
|– sub
| – test2.py
– test1.py
若在程序test2.py中导入模块mod1.py和mod2.py。首先需要在mod2下建立__init__.py文件(同(2)),src下不必建立该文件。然后调用方式如下:
下面程序执行方式均在程序文件所在目录下执行,如test2.py是在cd sub;之后执行python test2.py
而test1.py是在cd src;之后执行python test1.py; 不保证在src目录下执行python sub/test2.py成功。
import sys
sys.path.append(“..”)
import mod1
import mod2.mod2
总结:
当要导入的文件和当前文件在同一个目录时,可以直接导入这个文件。
当要导入的文件或者目录和当前文件不在同一目录时,需要先跳到要导入文件的父级目录(即将父级目录加入系统路径),然后一级一级的用点号连接走过的目录或者文件,直到到达要导入的模块。