手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


如果图片出不来请转https://www.bilibili.com/read/cv258381,都是本人写的


前面介绍函数的时候说过闭包,推荐一个网站做扩展阅读http://bbs.fishc.com/thread-42656-1-1.html,其实不用太在意这个东西,其实就是一个函数嵌套,然后返回的是一个函数类型而已,只是在用的时候要注意一些细节,笔者在第三讲里(http://mp.blog.csdn.net/postedit/79342158)已经有过比较明确的说明。

首先我们了解下什么叫做模块(module)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

还记得以前我们用过的random吗?我们看看当时是怎么做的

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

import是引入模块的必须用的关键字,我们不加它直接引用里面的函数会报错

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

当然这是笔者重新启动了IDLE才会报错,此时random是没有被引入的,之前已经引入过random,不重启IDLE的话这个模块就一直可以用的,不会报错,也就是说每次打开IDLE,你需要用哪一个模块,你是一劳永逸的,只需要import一次。

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

什么是OS?

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

ios其实就是iphone 的操作系统Mac os就是苹果笔记本的操作系统。

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

但是python是非常强大的,它是可以跨平台的,就是依赖于OS模块

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


目录函数

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

以上图片内容来自http://bbs.fishc.com/thread-45512-1-1.html

1.改变目录和显示目录内容

我们来试一试这些函数首先是get current working directory函数,也就是getcwd()

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

我是把python装在了D盘

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

python安装目录就是默认的当前目录。如果你修改了当前目录

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

它就跑到了你修改的那个目录,并且目录一定要用字符串,在window里'\\'和'/'都可以作为分隔符。它显示的都是'\\',但是你用'/'也是ok的。下一个函数listdir,其实和dos操作系统命令还是很像的

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

我们来看看E盘有没有这些

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

有些是隐藏文件,python也显示出来了,比如'System volume information’,它是一个系统卷信标信息。在这里还要介绍一些表示方法,'.'在windows和Linux里代表当前目录,‘..’代表上级目录。

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

getcwd没有参数,而且目录最顶层就是哪个磁盘,当前在磁盘目录下,‘..'还是到这个磁盘目录下。

我们还可以看到listdir可以不给参数,默认参数就是当前目录。

2.创建目录

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


E盘已经有这个文件夹,所以会出错。

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

就有了这么一个文件夹,并且创建目录不会改变当前目录,只有chdir函数可以修改当前工作目录。还可以嵌套创建,但是你这个A必须得先创建有才行,因为mkdir只能创建单层目录

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

可以同时创建两个吗?

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

第二个错误是什么意思呢?我们来看下它的帮助文档

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

我们看到mkdir可以有多个参数,但是对于windows来说我们只需要一个路径path参数,后面是有一个整数,所以python报错说需要一个integer也就是整数。用window的就不用管了,只需要知道给路径就可以了,其它操作系统可以看help去看参数的意义。

makedirs看着好像一头雾水,我们看下help

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

好像还是不懂,我们来实际用一下

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

我们看到mkdir会报错,这是因为E盘里没有C这个文件夹,那么你是无法创建C里的D的,但是我们用makedirs就可以

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

我们看到在E盘的C里创建一个D和在E盘的C里创建一个E是不冲突的,但是如果你已经在E盘有了一个C,你再在E盘里创建一个C那是不行的。也就是说只要你路径最后的那个文件夹以前不存在都是ok的。

我们来看下这些操作是不是区分大小写

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

看到是不区分大小写的

3.删除目录

我们首先新建了个文件

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

下面你会知道我为什么要新建的

rmdir是删除单层目录

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

我们从上图看到,1.remove删不了文件夹,它只能删除文件。

2.用rmdir如果你要和删除的目录(文件夹)不是空的,会报错。其实即使A里面的文件夹都是空的也会报错

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

3用rmdir需要一层一层删除,很麻烦于是我们有了removedirs

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

上图可以得到

  1. removedirs是把你输入的路径中的文件夹从后往前都删除了,

    但是注意下面的情况,当你把当前路径改到E盘c文件夹时,输入E:/c:/e只是把e删除了,也就是说是只会从后往前删到当前目录为止,不包括当前目录文件夹,当前目录是不会被破坏改变的。

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)



手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

2.删除没有的目录是会报错的。

同样的,如果要删除的文件夹里有文件,你要先删除文件,它不会帮你删除文件,这里不太智能。

如果你妄想删除c呢?

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

python正在使用E:/c是无法删除的要想删除只能修改当前目录

4.其它目录函数

rename改文件夹名字

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

改文件名字

我新建了一个txt文件

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)
  1. 新旧名字一样是可以的,不会报错,相当于没改。

  2. 改名的文件不存在会报错

system()

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

cmd应该是个命令提示符,是和dos很像的这么一个东西

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

不知道什么原因,调不出来这个东西,clc是计算器,一把来说都可以调出来的,可能现在用的电脑系统的问题。

walktop后面有习题会进行讲解

5.通用目录函数

通用就是说可以跨平台用

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

在windows和Linux你可以用‘.’表示当前目录,但是其它操作 系统不一定使用,通用的写法是os.curdir,其它都是一样的道理。

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

nt是windows的架构,posix是UNIX的架构,mac是苹果的架构。

我们还可以看出来通用目录函数可以和上面的函数结合使用,这样的代码可以跨平台运行。

路径函数

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

1.纸上谈兵类

之所以说它们纸上谈兵,是因为它们不能识别这个目录或者文件是否存在,只是单纯地对字符串进行操作。

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

我们看到basename是把最底层也将就是最右边的文件或者文件夹名字返回。

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

但是当前目录它只会返回一个‘.’上面这个图里python3没有显示‘c'。那么如果一个路径不存在会如何?

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

它没有识别出来。说明它只是个单纯对字符串进行操作,完全不考虑有没有。下面几个函数也是一样

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

join其实和'\\'.join([])我感觉完全一样的注意我在join里加了中括号,因为它只能有一个参数,所以我们用一个列表来装。os.path.split相当于s.rsplit('/',1)。os.path.splitext相当于s.rsplit('.',1)。

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

rsplit是从右边开始分隔而已

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

2.实事求是类

如果文件没有它们会报错。

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

getsize文件不存在会报错,不存在则返回大小的字节数(和占用空间是不一样的),

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

摘自https://jingyan.baidu.com/article/a3a3f811f3ec558da2eb8a30.html

可以看到是对的,但是参数如果是文件夹就会有问题,我们看到这个2.txt是在e这个文件夹里,但是他的大小是0。下面三个时间和上面的函数一一对应。但是直接用getatime,getctime,getmtime返回的是一个浮点秒数,需要用gmtime()(格林尼治时间,0经度)或者localtime()(当地时间)函数来转换。

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

如果文件不存在,那么也会报错。我们看到时间都是对的。

3.返回值布尔型

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

以上摘自百度百科

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

我们创建了一个快捷方式,下面来看代码实例

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

文件对于dir是false,文件夹对于file是false。

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

符号链接和快捷方式还是有区别。如果有大佬懂的话,请在评论区指教一下。还看到很奇葩的一个情况,我电脑上是没有分A盘的,但是还是返回了True,奇葩的是'A:'和'E:'结果却不一样,而且和当前目录还有关系,如果当前目录在E,‘E:’就判断为False了,似乎这个判断也是纸上谈兵类。笔者查了很多,但是不知道上面是个什么情况。

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

如果文件不存在,samefile会报错。samefile可以判断出两个链接是不是指向同一个文件。还有我们可以肯定isabs也是一个纸上谈兵类,即使目录不存在,它也就是直接去判断字符串内容而已,对windows来说字符串最左边是'.'或者'..',那么它就是相对路。

如果还有什么不明白的推荐个网站http://www.runoob.com/python/os-file-methods.htmlhttps://segmentfault.com/q/1010000005770628可以去看一看

几道习题

0.编写一个程序,统计指定目录下每个文件类型(包括文件夹)的文件数,以及各个文件(不包括文件夹)的大小。

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)
  1. 编写一个程序,用户输入要搜索的文件类型和开始搜索的路径,搜索该文件是否存在遇到文件夹则进入文件夹继续搜索。


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

我把something1.txt复制了2份一份在

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

另一份在

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)





答案

0.我们事先是不知道文件夹里有多少种文件类型的,笔者想过用两个列表用append来增加元素个数,通过下标来对应文件类型和文件个数,后来想想还是直接用字典吧。首先回顾一下setdefault函数

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

还有字符串格式化的一些知识,注意后面只能小括号括起来,不然会报错。这里应该是固定格式 其实后面也不是个元组,因为报错是说参数不够,元组也只是一个参数 ,这里死记即可。

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

程序代码

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

结果

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

不相信结果的可以去和上面对比。

1

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

如果你要在磁盘里查找会报错,因为'system volume information'是系统文件,它拒绝你访问。

python隐藏文件名都能给你读出来,所以即使你隐藏了.avi,.rmvb.mp4,python都能找出来。但是恰巧是可以显示出系统文件带来了麻烦。

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

我们看到'system volume information'还是比较靠后的,笔者可是正直的人,是不会有.avi这种文件的^_^。

>>>表示python处于就绪状态,说明程序执行完毕,如果没出现的话说明正在运行代码。笔者修改了一下代码,专门针对那个系统卷标信息。

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

嗯,好吧还是有那么一两个.avi,OTZ。

2.复习一下find函数

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

字符串里有这个参数则find返回索引值,没有返回-1,第二个参数是开始查找的索引值。但是它只返回一个最小的索引值,所以要想找到所有的需要循环。

walk是遍历给定目录下所有的目录,返回root,包含的目录,包含的文件。下面就是walk的一个例子

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

我们在C和e里个新建一个文件1.txt,再试一次

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

注意上面强制加了list后返回的是一个以三元素元组为元素的列表,每个元组的后面两个参数都是列表的形式。我们看看题意要求的。

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

代码

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

结果

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)


手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

怀疑有错的可以去上面对比。

受到这个waik的启发,我们可以把1的代码改一改,用waik而不是递归实现手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

手把手教你学python3第八讲(OS模块有关文件系统的函数操作)

结果是一样的,有了python3的文件系统,担心你硬盘里的资源吧,233,下一讲再见。