从python列表中删除文件名

从python列表中删除文件名,python,Python,我在名为files的列表中有一个目录的所有文件名。我想对其进行过滤,以便只保留扩展名为.php的文件 for x in files: if x.find(".php") == -1: files.remove(x) 但这似乎忽略了文件名。对此我能做些什么?简单的列表理解怎么样 files = [f for f in files if f.endswith('.php')] 或者,如果您因此更喜欢发电机: files = (f for f in files if f.e

我在名为files的列表中有一个目录的所有文件名。我想对其进行过滤,以便只保留扩展名为.php的文件

for x in files:
    if x.find(".php") == -1:
        files.remove(x)

但这似乎忽略了文件名。对此我能做些什么?

简单的列表理解怎么样

files = [f for f in files if f.endswith('.php')]
或者,如果您因此更喜欢发电机:

files = (f for f in files if f.endswith('.php'))

简单的列表理解怎么样

files = [f for f in files if f.endswith('.php')]
或者,如果您因此更喜欢发电机:

files = (f for f in files if f.endswith('.php'))

提供的大多数答案都给出了列表/生成器的理解,这可能是90%的情况下您想要的方式,特别是如果您不想修改原始列表

但是,对于那些(比如出于大小原因)希望修改原始列表的情况,我通常使用以下代码段:

idx = 0
while idx < len(files):
    if files[idx].find(".php") == -1:
        del files[idx]
    else:
        idx += 1
idx=0
而idx
至于为什么您的原始代码不起作用-当您迭代它时,它正在更改列表。。。“for x in files”隐式地创建了一个迭代器,就像您执行了“for x in iter(files)”一样,删除列表中的元素会混淆迭代器的位置。对于这种情况,我通常使用上面的代码,或者如果它在项目中经常发生,则将其分解为一个函数,例如:

def filter_in_place(func, target):
    idx = 0
    while idx < len(target):
        if func(target[idx)):
            idx += 1
        else:
            del target[idx]
def过滤器到位(func,目标):
idx=0
当idx
提供的大多数答案都给出了列表/生成器的理解,这可能是90%的情况下您希望采用的方式,尤其是在您不想修改原始列表的情况下

但是,对于那些(比如出于大小原因)希望修改原始列表的情况,我通常使用以下代码段:

idx = 0
while idx < len(files):
    if files[idx].find(".php") == -1:
        del files[idx]
    else:
        idx += 1
idx=0
而idx
至于为什么您的原始代码不起作用-它在您对其进行迭代时会更改列表…“for x in files”隐式地创建了一个迭代器,就像您在iter(files)中为x所做的那样,并且删除列表中的元素会混淆迭代器的位置。对于这种情况,我通常使用上面的代码,或者如果在项目中经常发生,则将其分解为一个函数,例如:

def filter_in_place(func, target):
    idx = 0
    while idx < len(target):
        if func(target[idx)):
            idx += 1
        else:
            del target[idx]
def过滤器到位(func,目标):
idx=0
当idx
刚刚偶然发现了这个老问题。这里的许多解决方案都可以解决这个问题,但它们忽略了文件名可能仅为“.php”的情况。我怀疑问题是关于如何过滤php脚本,“.php”可能不是php脚本。我建议的解决方案如下:

>>> import os.path
>>> files = ['a.php', 'b.txt', 'c.html', 'd.php', '.php']
>>> [f for f in files if os.path.splitext(f)[1] == ".php"]

刚刚偶然发现了这个老问题。这里的许多解决方案都可以解决这个问题,但它们忽略了文件名可能仅为“.php”的情况。我怀疑问题是关于如何过滤php脚本,“.php”可能不是php脚本。我建议的解决方案如下:

>>> import os.path
>>> files = ['a.php', 'b.txt', 'c.html', 'd.php', '.php']
>>> [f for f in files if os.path.splitext(f)[1] == ".php"]

您正在修改正在迭代的列表。这通常是一个坏主意(并且是导致“跳过文件名”的原因)。您正在修改正在迭代的列表。这通常是一个坏主意(并且是导致“跳过文件名”的原因)。好的一点,这可能在非常大的列表或低端系统中派上用场。好的一点,这可能在非常大的列表或低端系统中派上用场。