我有一点问题,我无法理解为什么我的程序会做这件事。 你能救我吗?
我有一个包含许多不同文件的目录。 我需要一个“.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']
你有什么想法吗?感谢。
答案 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')]