python 内置模块os 和 sys

Posted QQ糖_尤尤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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根据传入的相对/绝对路径返回对应的绝对路径

     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

 

总结:

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

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

 

以上是关于python 内置模块os 和 sys的主要内容,如果未能解决你的问题,请参考以下文章

python内置模块

python内几种常用内置模块的介绍,包括time模块,datetime模块,random模块,os模块,sys模块,hashlib模块

part10-1 Python常见模块(sys模块os模块)

Python模块

python常用模块 | Python

Python模块导入和常用内置方法