频道栏目
首页 > 程序开发 > Web开发 > Python > 正文
python查漏补缺之list列表的remove
2015-04-20 10:58:33         来源:书读的太少,想的太多  
收藏   我要投稿

 

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

 

 

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的删除这一步吧,没有想到删除之后的列表调整吧,哈哈!



 

点击复制链接 与好友分享!回本站首页
相关TAG标签 查漏
上一篇:Python Show-Me-the-Code
下一篇:Python操作MySQL数据库实例
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站