我有一个小问题,我不明白为什么我的程序会这样做。 你能帮我吗?
我有一个包含很多不同文件的目录。 我需要“.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']
你有什么想法吗?谢谢。
最佳答案
这可以通过 glob
模块轻松完成:
import glob, os
files = [f for f in glob.glob('*.TXT') if os.path.isfile(f)]
请注意,并非所有操作系统(例如 Windows)都区分大小写的文件名,因此对于此类操作系统,.txt
和 .TXT
是相同的。
您的代码的问题是您在迭代列表时修改了列表,不要这样做。相反,迭代浅拷贝。
来自docs :
To change a sequence you are iterating over while inside the loop (for example to duplicate certain items), it is recommended that you first make a copy. Looping over a sequence does not implicitly make a copy. The slice notation makes this especially convenient:
for f in files[:]:
...
关于python - 从目录中的文件列表中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19962045/