python遍历目录就是这么简单

python遍历目录就是这么简单,第1张

有时我们有列出目录下都有哪些文件和子目录的需求,这种情况是有现成命令可用的,比如windows下的dir命令,linux下的ls命令都可以,那我们用python代码怎么实现呢?

我们利用python丰富的库很容易就能实现一个简易版本,下面我们就用4种方法来实现它。

一、使用os.popen

os.popen工作原理是新建一个子进程,然后用这个子进程执行命令,父进程与子进程间通过管道进行通信。

根据调用popen时的传参,我们可以通过管道读取子进程的输出也可以向子进程写数据,默认是读取子进程的输出。

从以上描述可以看出popen是非常通用的,不是只能用于我们这个例子哦。

那我们开始用它实现我们的需求吧,代码如下:

哈哈,是不是很简单,这种方式虽然能达到目的但其实并不是我们想要的,我们本来就是要实现ls的,结果调用了ls,所以严格意义上来说我们并没有实现ls,那让我们继续往下看其它方法吧,嘿嘿。

二、使用glob.glob

glob可以根据你使用的通配符对文件进行匹配,利用这个特性我们可以列出当前目录下都有哪些文件和子目录,如下代码:

三、使用os.listdir

os.listdir同样可以列出某个目录下都有哪些文件和子目录,如下代码:

四、使用os.walk

os.walk在遍历目录方面非常强大,它不但可以遍历你需要的目录,也可以递归遍历子目录且递归的深度可以用代码控制,下面让我们分别看下怎么遍历整个目录树以及怎么控制深度吧。

os.walk默认是遍历整个目录树的,如下代码就会递归打印出当前目录下所有文件:

那我们怎么控制遍历的深度,比如只遍历n层呢?其实很简单,只需要定义一个深度变量,然后到达n后跳出循环即可,如下代码就只遍历1层:

至此我们已经写完4种方法了,如果你还有其他方法,欢迎评论交流。

将多个路径组合后返回

注:第一个绝对路径之前的参数将被忽略

输出:

当然还可以放在列表里面,一起输出啊:

使用深度遍历进行模拟压栈

输出结果:

collections是Python内建的一个集合模块,提供了许多有用的集合类。

我们知道 tuple 可以表示不变集合,例如,一个点的二维坐标就可以表示成:

但是,看到 (1, 2) ,很难看出这个 tuple 是用来表示一个坐标的。

定义一个class又小题大做了,这时, namedtuple 就派上了用场:

namedtuple 是一个函数,它用来创建一个自定义的 tuple 对象,并且规定了 tuple 元素的个数,并可以用属性而不是索引来引用 tuple 的某个元素。

这样一来,我们用 namedtuple 可以很方便地定义一种数据类型,它具备tuple的不变性,又可以根据属性来引用,使用十分方便。

可以验证创建的 Point 对象是 tuple 的一种子类:

类似地,如果要用坐标和半径表示一个圆,也可以用 namedtuple 定义:

使用 list 存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为 list 是线性存储,数据量大的时候,插入和删除效率很低。

deque是为了高效实现插入和删除 *** 作的双向列表,适合用于队列和栈:

deque 除了实现list的 append() 和 pop() 外,还支持 appendleft() 和 popleft() ,这样就可以非常高效地往头部添加或删除元素。

使用 dict 时,如果引用的Key不存在,就会抛出 KeyError 。如果希望key不存在时,返回一个默认值,就可以用 defaultdict :

注意默认值是调用函数返回的,而函数在创建 defaultdict 对象时传入。

除了在Key不存在时返回默认值, defaultdict 的其他行为跟 dict 是完全一样的。

使用 dict 时,Key是无序的。在对 dict 做迭代时,我们无法确定Key的顺序。

如果要保持Key的顺序,可以用 OrderedDict :

注意, OrderedDict 的Key会按照插入的顺序排列,不是Key本身排序:

OrderedDict 可以实现一个FIFO(先进先出)的dict,当容量超出限制时,先删除最早添加的Key:

Counter 是一个简单的计数器,例如,统计字符出现的个数:

Counter 实际上也是 dict 的一个子类,上面的结果可以看出,字符 'g' 、 'm' 、 'r' 各出现了两次,其他字符各出现了一次。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/tougao/11523733.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-16
下一篇2023-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存