python查漏补缺之list列表的remove

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">        今天碰到一个坑,python的列表问题,错误往往出在你最熟悉的地方,特别是小地方,问题:我要列出目录下所有的下一级文件和子目录(只包含下一级目录而不包括目录的目录及文件这种情况),然后只获取当前子目录。。问题描述很清楚,很轻易的就写了个函数,不就是os.listdir(path)嘛,对就是这个,这个功能可以列出下一级的所有目录和文件,返回结果在一个列表中,那我们的主要工作的常规思路是不是就是把这个结果列表进行过滤?好,os也有相关的功能,os.path.isfile(filepath),就可以判断文件是不是一个文件,是文件,那就从列表删除,处理完,就是我们要的最终结果列表了,是不是这样呢?想法很完美,现实很残酷,很意外,这个搞不定的。我们用代码实验:</span>
import os

def Count_SubDir(src):
    listall = os.listdir(src)
    for line in listall:
        filepath = os.path.join(src,line)
        if os.path.isfile(filepath):
            listall.remove(line)
    return listall

if __name__ == "__main__":
    src = r'f:\src'
    ret = Count_SubDir(src)
    for line in ret:
        print line

输出结果:

>>> ================================ RESTART ================================
>>>
1025
1028
1029
1030
1031
1032
1033
1035
1036
1037
1038
1040
1041
1042
1043
1044
1045
1046
1049
1053
1055
2052
2070
3076
3082
Graphics
NDP40-KB2894842.msp
Setup.exe
SetupUi.dll
SetupUtility.exe
sqmapi.dll
UiInfo.xml
>>> 

看结尾。。。还依然有文件存在,我们对比下没经过处理的原结果列表:

>>> ================================ RESTART ================================
>>>
1025
1028
1029
1030
1031
1032
1033
1035
1036
1037
1038
1040
1041
1042
1043
1044
1045
1046
1049
1053
1055
2052
2070
3076
3082
DHtmlHeader.html
Graphics
header.bmp
NDP40-KB2894842.msp
ParameterInfo.xml
Setup.exe
SetupEngine.dll
SetupUi.dll
SetupUi.xsd
SetupUtility.exe
SplashScreen.bmp
sqmapi.dll
Strings.xml
UiInfo.xml
watermark.bmp
>>> 

最后的文件项目,可以对比下,是不是发现什么规律了。。。隔一个漏掉一个。。。

那为什么会出现这种情况呢?就是因为for循环和list.remove()方法的配合有问题,把流程自己走一遍,问题就暴露出来了

我们走一遍:首先for循环,每次循环选中一个line,如果这个line是文件,从list中删除,然后第二次循环。。。。问题来了,是不是漏掉了什么?删除之后,是不是还有什么操作没有代码显示?答案是有,

def Count_SubDir(src):
    listdir = []
    listall = os.listdir(src)
    for line in listall:
        filepath = os.path.join(src,line)
        if os.path.isdir(filepath):
            listdir.append(filepath)
    return listdir

输出结果为:

Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
f:\src\1025
f:\src\1028
f:\src\1029
f:\src\1030
f:\src\1031
f:\src\1032
f:\src\1033
f:\src\1035
f:\src\1036
f:\src\1037
f:\src\1038
f:\src\1040
f:\src\1041
f:\src\1042
f:\src\1043
f:\src\1044
f:\src\1045
f:\src\1046
f:\src\1049
f:\src\1053
f:\src\1055
f:\src\2052
f:\src\2070
f:\src\3076
f:\src\3082
f:\src\Graphics
>>> 

好了,这次真的完整了,是真的目录了。。。。不敢信,一开始没找到问题的时候,总感觉没问题。。。不分析结果还真把remove方法的末尾处理给漏掉了。。。我想不少人也只是知道remove的删除这一步吧,没有想到删除之后的列表调整吧,哈哈!

时间: 2024-12-08 05:34:32

python查漏补缺之list列表的remove的相关文章

python查漏补缺 --- 模块及异常

1.方法定义好之后,如,def test(x) : ,此时将方法名赋值给一个新的变量,那么该变量等同于方法,可以具备test方法内部的全部功能2.导包的时候,可以使用as关键字在不同的名称下导入模块或对象,这主要是在模块或对象具有冗长或混淆的名称时使用3.python中主要有三种模块 a.自定义的类和方法 b.外部源安装的(第三方) c.python预安装的(也称作标准库,python具有广泛的标准库是它作为语言的主要优点之一,这些标准库有些是python写的,有些是C语言写的,多数都可以在所有

java知识查漏补缺

一.重写(override)和重载(overload)的区别 二者除了名字相似,其实没什么联系 范围不同:重写发生在同一个类的不同方法之间.重载发生在父类和子类自荐. 前提: 重写要求:方法名相同,参数列表不同,对于返回值类型不要求相同. 重载要求:方法名形同,参数列表也相同.重载是实现多态的关键,注意如果父类中的方法是private类型,那么子类中对应方法不算重载,而相当于是定义了一个新方法. 二.final的用法 修饰类:该类不能被继承 修饰方法:该方法不能被重写 修饰属性:该属性初始化后不

2019/5/12 查漏补缺

目录 2019/5/12 查漏补缺 数据类型分为两大类:基本类型和引用类型: java中类的继承关系 关于接口 重载和重写 静态变量 java中的关键字和保留字 数据库操作 实现数据库收回部分权限的操作 关于数据库错误类型 SQL四种语言: 数据库常见的四种故障 数据库设计六个阶段: Java的异常分为两种 外模式,内模式 数据库范式 语句null的书写 2019/5/12 查漏补缺 数据类型分为两大类:基本类型和引用类型: 基本类型只能保存一些常量数据,引用类型除了可以保存数据,还能提供操作这

近来的java小总结(2.1):类的知识的查漏补缺

首先,我是一名新手,所以,要带着批判的眼光来看下面的文章   这篇文章说了些什么? 这文章是我近来8.6号来在编程思想上打的代码,从0~200页的源码接近到在这里,下文正是总结这0~200页的的知识,涉及到接口,内部类.初始化,数值计算的一些细节.此文章不会一下子写完,可能隔一天可能再补下来.因为代码确实有点多.. 注意 1 我的注释不一定正确(不过各小标题和代码一定是正确的,因为是书本上的原话,但是注释不一定正确),如果你确信我的内容的话,你可能会损失很大,因为我只是个菜鸟,我只是来补救一些知

查漏补缺——java多态

---恢复内容开始--- 刚学完java,开始了查漏补缺阶段阶段,为了巩固自己的知识和为别人提供一些微末的帮助决定开通博客,求各位大牛们指出我的不足,不要吝惜言语,也希望我的总结可以对别人有帮助,对自己对他人负责. 开始正文:术语多态:可以定义为“有多种形态”,多态引用是一个一个在不同时刻可以指向不同类型对象的引用变量.通过多态引用可以调用不同的具体的方法. 类方法的多态性的实现有两种方式: 1:方法重载:可以声明多个同名但是参数不同(个数.类型和顺序)的方法.注意呵呵重载方法只能声明在一个类里

近来的java小总结(2.2):类的知识的查漏补缺

1 首先,我是一名新手,所以,要带着批判的眼光来看下面的文章   这篇文章说了些什么? 这文章是我近来8.6号来在编程思想上打的代码,从0~200页的源码接近到在这里,下文正是总结这0~200页的的知识,涉及到接口,内部类.初始化,数值计算的一些细节.此文章不会一下子写完,可能隔一天可能再补下来.因为代码确实有点多.. 注意 1 我的注释不一定正确(不过各小标题和代码一定是正确的,因为是书本上的原话,但是注释不一定正确),如果你确信我的内容的话,你可能会损失很大,因为我只是个菜鸟,我只是来补救一

自家用的java小总结(2.4):类的知识的查漏补缺(内部类)

1 2      首先,这是一篇自己用的文章,不对读者承担任何责任,所以,要带着批判的眼光来看下面的文章   1 发现了,得加上输出结果,怕自己出错,~~   这篇文章说了些什么? 这文章是我近来8.6号来在编程思想上打的代码,从0~200页的源码接近到在这里,下文正是总结这0~200页的的知识,涉及到接口,内部类.初始化,数值计算的一些细节.此文章不会一下子写完,可能隔一天可能再补下来.因为代码确实有点多.. 注意 1 我的注释不一定正确(不过各小标题和代码一定是正确的,因为是书本上的原话,但

查漏补缺

查漏补缺[1].this语句:this语句用于构造函数之间进行相互调用.this语句只能定义在构造函数的第一行,因为初始化要先执行.[2].对象的初始化过程 Person p =new Person("hei",10); 1.因为new用到了Person.class,所以先找到Person.class文件加载到内存中 2.执行类中的静态代码块,如果有的话,给Person.class类进行初始化 3.在堆内存中开辟空间,分配内存地址 4.在堆内存中建立对象的特有属性,并进行默认初始化 5

《CSS权威指南》基础复习+查漏补缺

前几天被朋友问到几个CSS问题,讲道理么,接触CSS是从大一开始的,也算有3年半了,总是觉得自己对css算是熟悉的了.然而还是被几个问题弄的"一脸懵逼"... 然后又是刚入职新公司,事情不算多,于是拿起<CSS权威指南>进行"基础学习"+"查漏补缺",本篇文章主要是总结了些自己认为CSS中值的注意的几个知识点(本文知识点仅限本书范围内,若要讲CSS全部样式,那本兽还是选择慢慢懵逼去~). 选择器 这里要说明的是类选择器的嵌套选择与多类