Python包之OS

参考:https://docs.python.org/3/library/os.html

Python中对OS模块的定位是:提供了使用操作系统的工具接口。
如果你想读写文件,可以参考open();
如果你想操作文件路径,参考os.path模块;
如果你想在命令行读取所有文件的所有行,参考fileinput模块;
如果你想创建临时文件或目录,参考tempfile模块;
如果你想更高级的文件和路径处理,参考shutil模块;

os.error

内置的OSError异常类型,比如在使用os模块中的函数接口时,在参数中提供了无效的文件或路径,就回报错os.error。

os.name

该变量返回当前操作系统的类型,当前只注册了3个值:分别是posix , nt , java, 对应linux/windows/java虚拟机。

print(os.name)
# posix

文件名,命令行参数和环境变量

在Python中,文件名,命令行参数和环境变量都是用字符串类型来表示。

进程参数

接下来的这些函数和数据提供了当前进程和用户的信息状态和操作接口。

os.ctermid()

返回进程控制终端的文件名,适用于Unix系统。

os.environ

返回字符串到环境变量的映射。

print(os.environ)
# environ({'PATH': '/anaconda3/bin','HOME': '/Users/sjd'})

os.chdir(path)

改变当前工作目录到指定的路径,path为要切换到的新路径。

os.fchdir(fd)

通过文件描述符改变当前工作目录。
文件描述符是内核为了高效管理已经被打开的文件所创建的索引,

进程通过文件描述符来访问文件。 在程序刚启动的时候默认有3个文件描述符:0(标准输入),1(标准输出),2(标准错误),系统默认提供了 0~2的文件描述符,之后的 当我们进行 open,create等操作的时候 自动添加进表

所以int creat(const char * ,mode_t)返回的文件int 就是你所进行操作的文件的唯一身份标示,

然后你只要拿着这个ID 然后告诉系统给我找xx, write(int fd,char *buf,int lenght) 通过fd得到准确文件 然后写入。

当我们新建creat,打开open 之后,得到的fd 是从3开始的 因为前面的三个被系统占了在OS X系统下测试 文件描述符表 自增,当释放close之后,fd变成-1,如果再继续新建 则填补之前的空缺。

os.getcwd()

返回当前工作目录。

os.fsencode(filename)

把字符串类型的文件名翻译成bytes类型的文件名;os.fsdecode()实现相反的功能。

os.fspath(path)

返回路径的文件系统表示。

os.getenv(key,default=None)

如果环境变量中存在key,返回环境变量key的值,否则返回default的值。

os.putenv(key,value)

设置环境变量key的值为value。

文件和路径

os.access(path,mode)

使用当前uid/gid检测对路径path是否有访问权限。其中,path为要检测是否有权限的路径,mode为权限类别,值可以为os.F_OK、os.R_OK、os.W_OK、os.X_OK中的一个或多个;

  • os.F_OK:测试path是否存在
  • os.R_OK:测试path是否可读
  • os.W_OK:测试path是否可写
  • os.X_OK:测试path是否可执行
os.access("provider.py", os.F_OK)
# True
os.access("provider.py", os.R_OK)
# True
os.access("provider.py", os.W_OK)
# True
os.access("provider.py", os.X_OK)
# False
os.access("provider.py", os.F_OK | os.X_OK)
# True

os.chdir(path)

切换当前的工作路径为path指定的路径。

os.chflags(path,flags)

设置路径path的标记为flags,flags为数字标记,多个flags可以使用or组合。flags可以为以下值或以下值的组合:

  • stat.UF_NODUMP:非转储文件
  • stat.UF_IMMUTABLE:文件是只读的
  • stat.UF_APPEND:文件只能追加内容
  • stat.UF_NOUNLINK:文件不可删除
  • stat.UF_OPAQUE:目录不透明,需要通过联合堆栈查看
  • stat.SF_ARCHIVED:可存档文件(超级用户可设)
  • stat.SF_IMMUTABLE:文件是只读的(超级用户可设)
  • stat.SF_APPEND:文件只能追加内容(超级用户可设)
  • stat.SF_NOUNLINK:文件不可删除(超级用户可设)
  • stat.SF_SNAPSHOT:快照文件(超级用户可设)
import stat
# 为文件设置标记,使得它不能被重命名和删除
os.chflags("provider.py",stat.SF_NOUNLINK)

os.chmod(path,mode)

更改文件或目录的权限。
path -- 文件名路径或目录路径
mode -- 可用以下选项按位或操作生成, 目录的读权限表示可以获取目录里文件名列表, 写权限表示可以获取文件并且可以修改内容,执行权限表示可以把工作目录切换到此目录 ,删除添加目录里的文件必须同时有写和执行权限 ,文件权限以用户id->组id->其它顺序检验,最先匹配的允许或禁止权限被应用。

  • stat.S_IXOTH: 其他用户有执行权0o001
  • stat.S_IWOTH: 其他用户有写权限0o002
  • stat.S_IROTH: 其他用户有读权限0o004
  • stat.S_IRWXO: 其他用户有全部权限(权限掩码)0o007
  • stat.S_IXGRP: 组用户有执行权限0o010
  • stat.S_IWGRP: 组用户有写权限0o020
  • stat.S_IRGRP: 组用户有读权限0o040
  • stat.S_IRWXG: 组用户有全部权限(权限掩码)0o070
  • stat.S_IXUSR: 拥有者具有执行权限0o100
  • stat.S_IWUSR: 拥有者具有写权限0o200
  • stat.S_IRUSR: 拥有者具有读权限0o400
  • stat.S_IRWXU: 拥有者有全部权限(权限掩码)0o700
  • stat.S_ISVTX: 目录里文件目录只有拥有者才可删除更改0o1000
  • stat.S_ISGID: 执行此文件其进程有效组为文件所在组0o2000
  • stat.S_ISUID: 执行此文件其进程有效用户为文件所有者0o4000
  • stat.S_IREAD: windows下设为只读
  • stat.S_IWRITE: windows下取消只读
import stat
# 设置用户组对文件具有执行权限
os.chmod("provider.py",stat.S_IXGRP)
# 设置其他用户对文件具有写权限
os.chmod("provider.py",stat.S_IWOTH)

os.chown(path,uid,gid)

更改路径的拥有者和group id为uid和gid。如果不修改可以设置为-1,并且需要超级用户权限来执行权限修改操作。
path -- 设置权限的文件路径
uid -- 所属用户ID
gid -- 所属用户组ID

# 设置所有者ID为100
os.chown("provider.py",100,-1)

os.chroot(path)

更改当前进程的根目录为path。

os.getcwd()

返回当前工作目录。

os.listdir(path=".")

返回path目录路径下的文件列表,列表没有固定的顺序。

os.mkdir(path)

创建目录path。如果目录已经存在,会抛出异常FileExistsError。

os.makedirs(name)

递归的目录创建,递归的意思是创建所有到达叶子目录的中间目录。

os.major(device)

从原始设备号(通常是stat中的st_dev或st_rdev)中提取设备major号码。

os.minor(device)

从原始设备号(通常是stat中的st_dev或st_rdev)中提取设备minor号码。

os.makedev(major, minor)

根据设备的major号码和minor号码组成原始设备号。

os.remove(path,*,dir_fd=None)

删除文件路径path。如果path指向的是目录路径,会抛出异常IsADirectoryError。如果要删除目录,使用rmdir。

os.removedirs(name)

递归的删除目录。与rmdir功能相似,不同的是,如果叶子目录被删除之后,removedirs会连续的删除每一层上级目录,直到抛出异常(异常会被忽略,因为异常通常意味着上层目录为非空目录)。

os.rename(src,dst,*,src_dir_fd=None,dst_dir_fd=None)

重命名文件或路径src为dst,如果dst已经存在,会抛出异常。

os.renames(old,new)

递归的重命名文件或目录。功能与rename类似,不同在于,renames首先创建new路径(即重命名之后的路径)的中间路径,然后创建完整new路径,最后,会使用removedirs删除掉old路径(实际上删除的是old路径与new路径不重合的部分)。

os.replace(src,dst)

重命名文件或路径src为dst。如果dst是目录,抛出异常OSError。如果dst是文件且已经存在,且用户具有权限,dst会被替换掉。

os.rmdir(path)

删除path目录。如果path不存在,或者path非空,会抛出异常FileNotFoundError或OSError。如果要删除整个目录树,可以使用shutil.rmtree()。

os.path

os.path.abspath(path)

返回path的绝对路径,效果等同于使用normpath:normpath(join(os.getcwd(), path))。

os.path.abspath("provider.py")
# /Users/sjd/Documents/4paradigm/datagen/provider.py

os.path.basename(path)

返回路径path的文件名,也就是对path调用os.path.split函数返回的元组的第二个元素。

os.path.basename("/Users/sjd/Documents/4paradigm/datagen/provider.py")
# provider.py
os.path.basename("/Users/sjd/Documents/4paradigm/datagen/")
# 返回空字符串

os.path.commonpath(paths)

paths为一个序列类型,其中每个元素表示一个路径,函数返回结果为每个元素所表示的路径的最长公共子路径。如果paths为空,或者paths同时包含绝对路径和相对路径,或者paths同时包含不同驱动类型的路径(比如Linux系统的路径和Windows系统的路径),则抛出异常ValueError。

# 全部为绝对路径
os.path.commonpath(["/Users/sjd/Documents/4paradigm/datagen/provider.py", "/Users/sjd/Documents/4paradigm/datagen/constant.py"])
# /Users/sjd/Documents/4paradigm/datagen
# 全部为相对路径
os.path.commonpath(["4paradigm/datagen/provider.py", "4paradigm/datagen/constant.py"])
# 4paradigm/datagen
os.path.commonpath(["Documents/4paradigm/datagen/provider.py", "4paradigm/datagen/constant.py"])
# 返回空字符串
# 抛出异常的情况
os.path.commonpath([])
# ValueError: commonpath() arg is an empty sequence
os.path.commonpath(["/Users/sjd/Documents/4paradigm/datagen/provider.py", "datagen/constant.py"])
# ValueError: Can't mix absolute and relative paths

os.path.commonprefix(list)

list中的每个元素表示一个路径,函数返回每个路径的最长的共有路径前缀,因为计算方式为逐个字符进行比较,所以可能返回的结果并非有效的路径,如果要返回有效路径,可以使用commonpath。

os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
# /usr/l
os.path.commonpath(['/usr/lib', '/usr/local/lib'])
# '/usr'

os.path.dirname(path)

返回path路径的目录部分,也就是对path调用os.path.split函数返回的元组的第一个元素。

os.path.dirname("Documents/4paradigm/datagen/provider.py")
# Documents/4paradigm/datagen

os.path.exists(path)

如果path指向的路径已存在,则返回True,否则返回False。

os.path.expanduser(path)

在Unix和Windows系统中,返回path路径中的~被替换成用户的home目录之后的结果。

os.path.expandvars(path)

path路径中的name或者{name}被环境变量中对应名称的值替代。

os.path.getatime(path)

返回最后一次访问path的时间,返回值的格式为一个float类型的数值,表示距离epoch基准时间1970-01-01 00:00:00的秒数。如果path表示的路径不存在或者没有权限,抛出异常OSError。

os.path.getmtime(path)

返回最后一次修改path的时间,返回值的格式为一个float类型的数值,表示距离epoch基准时间1970-01-01 00:00:00的秒数。如果path表示的路径不存在或者没有权限,抛出异常OSError。

os.path.getsize(path)

返回path表示的文件或路径的大小,以byte字节为单位。如果path表示的路径不存在或者没有权限,抛出异常OSError。

os.path.isabs(path)

如果path是绝对路径,返回True,否则返回False。

os.path.isfile(path)

如果path表示的是已存在的文件路径,返回True。

os.path.isdir(path)

如果path表示的是已存在的目录,返回True。

os.path.islink(path)

如果path表示的是链接,返回True。

os.path.ismount(path)

判断path是否为挂载点。

os.path.join(path, *paths)

连接一个或多个路径,path和多个*paths的连接会使用路径分隔符。

os.path.normcase(path)

对path的字母大小写进行normalize。在Windows系统中,path中的所有字母都转成小写,并且把正斜杠转成反斜杠。在其他操作系统中,返回path本身。

os.path.normpath(path)

对path进行normalize,删除多余的路径分隔符。

os.path.split(path)

split the path into a pair (head, tail),其中tail是path中最后的部分,并且永远不会含有斜杠,head是除了tail之外的部分。如果path以斜杠结尾,tail为空;如果path中不包含斜杠,head为空;如果path为空,head和tail都是空。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,326评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,228评论 1 304
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,979评论 0 252
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,489评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,894评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,900评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,075评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,803评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,565评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,778评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,255评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,582评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,254评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,151评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,952评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,035评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,839评论 2 277

推荐阅读更多精彩内容