python 内置模块os 和 sys

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 
>>>
  1. os.path.split
  2. os.path.join
  3. os.path.dirname
  4. os.path.basename
  5. 这些方法主要是对一个路径进行具体处理,默认按照dirname, basename的方式进行分解或组合
  6. >>> 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根据传入的相对/绝对路径返回对应的绝对路径

    import os
    
    print(os.path.abspath("."))   #当前目录的绝对路径
    print(os.path.abspath(r"."))
    
    print(os.path.abspath(".."))
    print(os.path.abspath(r".."))  #上级目录的绝对路径
    
    
    print(os.path.abspath(r"F:/python程序/导入路径研究/abspath功能.py"))
    print(os.path.abspath(r"F:/python程序/导入路径研究/abspath功能.py"))

    python 内置模块os 和 sys

    从输出结果看不出参数"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 

相对路径就是以当前文件为基准一级级目录指向被引用的资源文件。 
以下是常用的表示当前目录和当前目录的父级目录的标识符 
   <br />../ 表示当前文件所在的目录的上一级目录 <br />./ 表示当前文件所在的目录(可以省略) <br />/ 表示当前站点的根目录(域名映射的硬盘目录) <br />

import os
path1=os.path.abspath(‘.‘)   # 表示当前所处的文件夹的绝对路径
print(path1)
path2=os.path.abspath(‘..‘)  # 表示当前所处的文件夹上一级文件夹的绝对路径
print(path2)

结果如下:

>>> 
==================== RESTART: F:/python程序/导入路径研究/listdir.py ===================
F:\python程序\导入路径研究
F:\python程序
>>>

python 内置模块os 和 sys

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

总结:

  当要导入的文件和当前文件在同一个目录时,可以直接导入这个文件。

  当要导入的文件或者目录和当前文件不在同一目录时,需要先跳到要导入文件的父级目录(即将父级目录加入系统路径),然后一级一级的用点号连接走过的目录或者文件,直到到达要导入的模块。

相关推荐