今天想要给ls命令添加一个查出当前文件夹下所有文件(包括子文件夹内的文件)的功能。首先在当前文件夹下新创建了一个名为“测试文件夹”的文件夹,果然,os.listdir()可以列出当前文件夹下的文件和文件夹:
然后,子文件夹中如果还有子文件夹呢?这就需要用到递归,递归在以前没有学好。很重要,一定要学好。
递归的例子:
1 童谣:从前有座山
2 阶乘: 一个正整数的阶乘(英语:factorial)是所有小于或等于该数的正整数的积,并且0的阶乘为1。
递归总结:
那么最关键的问题就是, 我们怎么找到一个问题的递归算法呢?
Paul Graham提到, 你只需要做两件事情:
1 你必须要示范如何解决问题的一般情况, 通过将问题切分成有限小并更小的子问题。
2 你必须要示范如何通过有限的步骤, 来解决最小的问题(基本用例)。
如果这两件事完成了, 那问题就解决了。因为递归每次都将问题变得更小, 而一个有限的问题终究会被解决的, 而最小的问题仅需几个有限的步骤就能解决。
成功实现递归取出当前文件夹下所有文件,包括子文件夹中的文件:
其中if判断'.'是否在文件名中用于判断对象是文件夹or文件。
现在不够完美的是,会把所有文件一股脑的打印出来,没有分是在哪个子文件夹下?
再添加一句就可以实现:
有一个小问题,currentpath+'/'+filename也可以正确得到结果:
斜杠:/
反斜杠:\
如果在路径中想使用斜杠/连接,如上图即可。如果要用反斜杠\连接,则需要用'\\',两个反斜杠,进行转义。
\\n中的第一个\阻止了\n转义为换行(动作),而将\n按照原样打印出来。
还有一个在字符串前加 r
'r'是防止字符转义的 如果路径中出现'\t'的话 不加r的话\t就会被转义 而加了'r'之后'\t'就能保留原有的样子。
在字符串赋值的时候 前面加'r'可以防止字符串在不需要转义的时候不被转义。
r可以让print()函数把引号内的内容原样打印出来,及时转义字符\也失去作用。