如果图片出不来请转https://www.bilibili.com/read/cv258381,都是本人写的
前面介绍函数的时候说过闭包,推荐一个网站做扩展阅读http://bbs.fishc.com/thread-42656-1-1.html,其实不用太在意这个东西,其实就是一个函数嵌套,然后返回的是一个函数类型而已,只是在用的时候要注意一些细节,笔者在第三讲里(http://mp.blog.csdn.net/postedit/79342158)已经有过比较明确的说明。
首先我们了解下什么叫做模块(module)
还记得以前我们用过的random吗?我们看看当时是怎么做的
import是引入模块的必须用的关键字,我们不加它直接引用里面的函数会报错
当然这是笔者重新启动了IDLE才会报错,此时random是没有被引入的,之前已经引入过random,不重启IDLE的话这个模块就一直可以用的,不会报错,也就是说每次打开IDLE,你需要用哪一个模块,你是一劳永逸的,只需要import一次。
什么是OS?
ios其实就是iphone 的操作系统Mac os就是苹果笔记本的操作系统。
但是python是非常强大的,它是可以跨平台的,就是依赖于OS模块
目录函数
以上图片内容来自http://bbs.fishc.com/thread-45512-1-1.html
1.改变目录和显示目录内容
我们来试一试这些函数首先是get current working directory函数,也就是getcwd()
我是把python装在了D盘
python安装目录就是默认的当前目录。如果你修改了当前目录
它就跑到了你修改的那个目录,并且目录一定要用字符串,在window里'\\'和'/'都可以作为分隔符。它显示的都是'\\',但是你用'/'也是ok的。下一个函数listdir,其实和dos操作系统命令还是很像的
我们来看看E盘有没有这些
有些是隐藏文件,python也显示出来了,比如'System volume information’,它是一个系统卷信标信息。在这里还要介绍一些表示方法,'.'在windows和Linux里代表当前目录,‘..’代表上级目录。
getcwd没有参数,而且目录最顶层就是哪个磁盘,当前在磁盘目录下,‘..'还是到这个磁盘目录下。
我们还可以看到listdir可以不给参数,默认参数就是当前目录。
2.创建目录
E盘已经有这个文件夹,所以会出错。
就有了这么一个文件夹,并且创建目录不会改变当前目录,只有chdir函数可以修改当前工作目录。还可以嵌套创建,但是你这个A必须得先创建有才行,因为mkdir只能创建单层目录
可以同时创建两个吗?
第二个错误是什么意思呢?我们来看下它的帮助文档
我们看到mkdir可以有多个参数,但是对于windows来说我们只需要一个路径path参数,后面是有一个整数,所以python报错说需要一个integer也就是整数。用window的就不用管了,只需要知道给路径就可以了,其它操作系统可以看help去看参数的意义。
makedirs看着好像一头雾水,我们看下help
好像还是不懂,我们来实际用一下
我们看到mkdir会报错,这是因为E盘里没有C这个文件夹,那么你是无法创建C里的D的,但是我们用makedirs就可以
我们看到在E盘的C里创建一个D和在E盘的C里创建一个E是不冲突的,但是如果你已经在E盘有了一个C,你再在E盘里创建一个C那是不行的。也就是说只要你路径最后的那个文件夹以前不存在都是ok的。
我们来看下这些操作是不是区分大小写
看到是不区分大小写的
3.删除目录
我们首先新建了个文件
下面你会知道我为什么要新建的
rmdir是删除单层目录
我们从上图看到,1.remove删不了文件夹,它只能删除文件。
2.用rmdir如果你要和删除的目录(文件夹)不是空的,会报错。其实即使A里面的文件夹都是空的也会报错
3用rmdir需要一层一层删除,很麻烦于是我们有了removedirs
上图可以得到
removedirs是把你输入的路径中的文件夹从后往前都删除了,
但是注意下面的情况,当你把当前路径改到E盘c文件夹时,输入E:/c:/e只是把e删除了,也就是说是只会从后往前删到当前目录为止,不包括当前目录文件夹,当前目录是不会被破坏改变的。
2.删除没有的目录是会报错的。
同样的,如果要删除的文件夹里有文件,你要先删除文件,它不会帮你删除文件,这里不太智能。
如果你妄想删除c呢?
python正在使用E:/c是无法删除的要想删除只能修改当前目录
4.其它目录函数
rename改文件夹名字
改文件名字
我新建了一个txt文件
新旧名字一样是可以的,不会报错,相当于没改。
改名的文件不存在会报错
system()
cmd应该是个命令提示符,是和dos很像的这么一个东西
不知道什么原因,调不出来这个东西,clc是计算器,一把来说都可以调出来的,可能现在用的电脑系统的问题。
walktop后面有习题会进行讲解
5.通用目录函数
通用就是说可以跨平台用
在windows和Linux你可以用‘.’表示当前目录,但是其它操作 系统不一定使用,通用的写法是os.curdir,其它都是一样的道理。
nt是windows的架构,posix是UNIX的架构,mac是苹果的架构。
我们还可以看出来通用目录函数可以和上面的函数结合使用,这样的代码可以跨平台运行。
路径函数
1.纸上谈兵类
之所以说它们纸上谈兵,是因为它们不能识别这个目录或者文件是否存在,只是单纯地对字符串进行操作。
我们看到basename是把最底层也将就是最右边的文件或者文件夹名字返回。
但是当前目录它只会返回一个‘.’上面这个图里python3没有显示‘c'。那么如果一个路径不存在会如何?
它没有识别出来。说明它只是个单纯对字符串进行操作,完全不考虑有没有。下面几个函数也是一样
join其实和'\\'.join([])我感觉完全一样的注意我在join里加了中括号,因为它只能有一个参数,所以我们用一个列表来装。os.path.split相当于s.rsplit('/',1)。os.path.splitext相当于s.rsplit('.',1)。
rsplit是从右边开始分隔而已
2.实事求是类
如果文件没有它们会报错。
getsize文件不存在会报错,不存在则返回大小的字节数(和占用空间是不一样的),
摘自https://jingyan.baidu.com/article/a3a3f811f3ec558da2eb8a30.html
可以看到是对的,但是参数如果是文件夹就会有问题,我们看到这个2.txt是在e这个文件夹里,但是他的大小是0。下面三个时间和上面的函数一一对应。但是直接用getatime,getctime,getmtime返回的是一个浮点秒数,需要用gmtime()(格林尼治时间,0经度)或者localtime()(当地时间)函数来转换。
如果文件不存在,那么也会报错。我们看到时间都是对的。
3.返回值布尔型
以上摘自百度百科
我们创建了一个快捷方式,下面来看代码实例
文件对于dir是false,文件夹对于file是false。
符号链接和快捷方式还是有区别。如果有大佬懂的话,请在评论区指教一下。我还看到很奇葩的一个情况,我电脑上是没有分A盘的,但是还是返回了True,奇葩的是'A:'和'E:'结果却不一样,而且和当前目录还有关系,如果当前目录在E,‘E:’就判断为False了,似乎这个判断也是纸上谈兵类。笔者查了很多,但是不知道上面是个什么情况。
如果文件不存在,samefile会报错。samefile可以判断出两个链接是不是指向同一个文件。还有我们可以肯定isabs也是一个纸上谈兵类,即使目录不存在,它也就是直接去判断字符串内容而已,对windows来说字符串最左边是'.'或者'..',那么它就是相对路。
如果还有什么不明白的推荐个网站http://www.runoob.com/python/os-file-methods.htmlhttps://segmentfault.com/q/1010000005770628可以去看一看
几道习题
0.编写一个程序,统计指定目录下每个文件类型(包括文件夹)的文件数,以及各个文件(不包括文件夹)的大小。
编写一个程序,用户输入要搜索的文件类型和开始搜索的路径,搜索该文件是否存在遇到文件夹则进入文件夹继续搜索。
我把something1.txt复制了2份一份在
另一份在
答案
0.我们事先是不知道文件夹里有多少种文件类型的,笔者想过用两个列表用append来增加元素个数,通过下标来对应文件类型和文件个数,后来想想还是直接用字典吧。首先回顾一下setdefault函数
还有字符串格式化的一些知识,注意后面只能小括号括起来,不然会报错。这里应该是固定格式 其实后面也不是个元组,因为报错是说参数不够,元组也只是一个参数 ,这里死记即可。
程序代码
结果
不相信结果的可以去和上面对比。
1
如果你要在磁盘里查找会报错,因为'system volume information'是系统文件,它拒绝你访问。
python隐藏文件名都能给你读出来,所以即使你隐藏了.avi,.rmvb.mp4,python都能找出来。但是恰巧是可以显示出系统文件带来了麻烦。
我们看到'system volume information'还是比较靠后的,笔者可是正直的人,是不会有.avi这种文件的^_^。
>>>表示python处于就绪状态,说明程序执行完毕,如果没出现的话说明正在运行代码。笔者修改了一下代码,专门针对那个系统卷标信息。
嗯,好吧还是有那么一两个.avi,OTZ。
2.复习一下find函数
字符串里有这个参数则find返回索引值,没有返回-1,第二个参数是开始查找的索引值。但是它只返回一个最小的索引值,所以要想找到所有的需要循环。
walk是遍历给定目录下所有的目录,返回root,包含的目录,包含的文件。下面就是walk的一个例子
我们在C和e里个新建一个文件1.txt,再试一次
注意上面强制加了list后返回的是一个以三元素元组为元素的列表,每个元组的后面两个参数都是列表的形式。我们看看题意要求的。
代码
结果
怀疑有错的可以去上面对比。
受到这个waik的启发,我们可以把1的代码改一改,用waik而不是递归实现
结果是一样的,有了python3的文件系统,担心你硬盘里的资源吧,233,下一讲再见。