2

我有一个小问题,我不明白为什么我的程序会做这件事。你能帮助我吗?

我有一个包含很多不同文件的目录。我需要一个“.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']

你有什么想法吗?谢谢。

4

2 回答 2

4

这可以通过glob模块轻松完成:

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

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

您的代码的问题是您在迭代列表时正在修改列表,不要那样做。而是迭代一个浅拷贝。

来自文档

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

for f in files[:]:
   ...
于 2013-11-13T19:00:36.107 回答
1

用理解来做这一切。这样您就不必遍历列表并查找具有该.TXT扩展名的文件。再加上这更多pythonic

files = [f for f in os.listdir('.') if os.path.isfile(f) and f.endswith('.TXT')]
于 2013-11-13T18:59:58.180 回答