Python的os库的使用

Python014

Python的os库的使用,第1张

python os库有很多和操作系统相关的功能。

其实不仅仅如此,os库中还有很多和文件路径,执行系统命令相关的。

下面是os模块常用的方法.

1.os.sep                    可以取代操作系统特定的路径分割符

2.os.name                字符串指示你正在使用的平台。比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'

3.os.getcwd()            函数得到当前工作目录,即当前Python脚本工作的目录路径

4.os.getenv()            用来读取环境变量

5.os.putenv()            用来设置环境变量

6.os.listdir()              返回指定目录下的所有文件和目录名

7os.remove()            函数用来删除一个文件

8.os.system()            函数用来运行shell命令

9.os.linesep              字符串给出当前平台使用的行终止符。例如,Windows使用'/r/n',Linux使用'/n'而Mac使用'/r'。

10.os.path.split()      函数返回一个路径的目录名和文件名

11.os.path.isfile()      检验给出的路径是一个文件

12os.path.isdir()        检验给出的路径是一个目录

13.os.path.existe()    函数用来检验给出的路径是否真地存在

14.os.listdir(dirname) 列出dirname下的目录和文件

15.os.getcwd()          获得当前工作目录

16.os.curdir                返回当前目录('.')

17.os.chdir(dirname)  改变工作目录到dirname

os.path都是和路径指定的文件,目录,和路径字符串有关系的函数

os.path.isdir(name)          判断name是不是一个目录,name不是目录就返回false

os.path.isfile(name)          判断name是不是一个文件,不存在name也返回false

os.path.exists(name)        判断是否存在文件或目录name

os.path.getsize(name)      获得文件大小,如果name是目录返回0L

os.path.abspath(name)    获得绝对路径

os.path.normpath(path)    规范path字符串形式

os.path.split(name)          分割文件名与目录(事实上,如果你完全使用目录,它也会将最后一个目录作为文件名而分离,同时它不会判断文件或目录是否存在)

os.path.splitext()              分离文件名与扩展名

os.path.join(path,name)    连接目录与文件名或目录

os.path.basename(path)  返回文件名

os.path.dirname(path)      返回文件路径

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

Python中对OS模块的定位是:提供了使用操作系统的工具接口。

如果你想读写文件,可以参考open();

如果你想操作文件路径,参考os.path模块;

如果你想在命令行读取所有文件的所有行,参考fileinput模块;

如果你想创建临时文件或目录,参考tempfile模块;

如果你想更高级的文件和路径处理,参考shutil模块;

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

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

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

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

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

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

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

通过文件描述符改变当前工作目录。

文件描述符是内核为了高效管理已经被打开的文件所创建的索引,

进程通过文件描述符来访问文件。 在程序刚启动的时候默认有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,如果再继续新建 则填补之前的空缺。

返回当前工作目录。

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

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

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

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

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

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

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

更改文件或目录的权限。

path -- 文件名路径或目录路径

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

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

path -- 设置权限的文件路径

uid -- 所属用户ID

gid -- 所属用户组ID

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

返回当前工作目录。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

判断path是否为挂载点。

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

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

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

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

在学习真实案例之前,我们先来了解一下Python文件操作的一些基本概念~~

如何创建读取和写出的文件对象,open()方法来搞定

他有两个参数,第一个就是读取的文件名称,第二个是可选的,指的是打开文件的模式,默认是读取文件。

当我们获取到读取文件对象fin之后我们就可以读取文件内容了,这里介绍两种方式。

第一种是直接读取文件内容,

第二种是按行读取文件内容。

区别在于如果你的文件非常大,如果直接读取效率会非常低下,甚至会撑爆内存。

所以按行读取按行处理就不会因为文件过大而产生问题了

文件读取完成之后写出文件有如下方式:

'\n'的意思是我们手动换行

最后关闭文件有两种方式

为什么要关闭文件呢?

如果不关闭他就会持续打开状态,琐事其他进程后者线程要操作它的时候就会报错

我们有时候写入非常大的数据的时候打开文件后会发现数据不是最新的?

这是因为python在写出文件是先写到内存中,等到一定的事件之后或者文件到达一定的数量之后才会写入到磁盘

所以我们如果想要看最新的数据,可直接调用如下方法

接下来我们使用数据进行测试

1. 文件读操作

文件读、写操作比较常见。读取文件,要先判断文件是否存在。

若文件存在,再读取;不存在,抛出文件不存在异常。

文件存在情况:

文件不存在情况:

open 后,务必要 close,这种写法有些繁琐,还容易出错。借助 with 语法,同时实现 open 和 close 功能,这是更常用的方法。

2.获取文件的后缀名

如何优雅地获取文件后缀名?os.path 模块,splitext 能够优雅地提取文件后缀。

3. 批量修改文件后缀名

修改之前

修改文件后缀名的文件方法如下:

从修改之后:

4. 获取文件名

有时拿到一个文件名时,名字带有路径。这时,使用 os.path、split 方法实现路径和文件的分离。

我们还可以直接使用使用os.path 模块,splitext 提取文件后缀名。

5.获取以指定后缀结尾的文件

当我们想要查询某路径下所有以固定后缀结尾的文件时,可以使用如下方法

6. 批量修改文件后缀名

后缀名批量修改,实现思路:

1. 遍历目录下的所有文件

2. 获取文件的后缀名

3. 如果后缀名命中为 old_ext,rename 重命名

defbatch_rename(work_dir, old_ext, new_ext):

"""

传递当前目录,原来后缀名,新的后缀名后,批量重命名后缀

7. 批量获取文件修改时间

os.walk 生成文件树结构,os.path.getmtime 返回文件的最后一次修改时间: