从目录中的文件列表中删除元素

时间:2013-11-13 18:54:31

标签: python list

我有一点问题,我无法理解为什么我的程序会做这件事。 你能救我吗?

我有一个包含许多不同文件的目录。 我需要一个“.TXT”文件列表(是的,大写)。

我的代码:

def listFile():
    files = [f for f in os.listdir('.') if os.path.isfile(f)]
    for f in files:
        if (f[-4:] != ".TXT"):
            del files[files.index(f)]

但我不知道为什么列表中只有“.TXT”元素。

我的目录的元素:

['OrdinaFile0.3.py', 'OrdinaFile0.4-p2.py', 'OrdinaFile0.4-p3.py', 'OrdinaFile0.5-p2.py', 'OrdinaFile0.6-p2.py', 'TxtToXls-p2.py', 'aula1.TXT', 'testFiles.py', 'testxlwt.py']

代码生成的列表:

['OrdinaFile0.3.py', 'OrdinaFile0.4-p2.py', 'OrdinaFile0.6-p2.py', 'aula1.TXT']

你有什么想法吗?感谢。

2 个答案:

答案 0 :(得分:4)

使用glob模块可以轻松完成此操作:

import glob, os
files = [f for f in glob.glob('*.TXT') if os.path.isfile(f)]

请注意,并非所有操作系统(例如Windows)都具有区分大小写的文件名,因此.txt.TXT对于此类操作系统是相同的。

您的代码的问题在于您在迭代时修改列表,不要这样做。迭代浅拷贝。

来自docs

  

要更改在循环内迭代的序列(for   例如复制某些项目),建议您先使用   复制一份。循环序列不会隐式地复制。   切片表示法使这一点特别方便:

for f in files[:]:
   ...

答案 1 :(得分:1)

理解这一切。这样您就不必遍历列表并查找哪些文件具有.TXT扩展名。此外,这更多pythonic

files = [f for f in os.listdir('.') if os.path.isfile(f) and f.endswith('.TXT')]