В python, как я могу исключить файлы из цикла, если они начинаются с определенного набора букв?

Я пишу Python script, который проходит через каталог и собирает определенные файлы, но есть несколько файлов, которые я хочу исключить, и все они начинаются с того же самого.

Пример кода:

for name in files:
   if name != "doc1.html" and name != "doc2.html" and name != "doc3.html":
      print name

Скажем, 100 каталогов HTML в каталоге начинаются с 'doc'. Каким будет самый простой способ их исключить?

Извините, я новичок в Python, я знаю, что это, вероятно, базовый.

Спасибо заранее.

Ответ 1

if not name.startswith('doc'):
     print name

Если у вас есть больше префиксов для исключения, вы можете даже сделать это:

if not name.startswith(('prefix', 'another', 'yetanother')):
     print name

startswith может принимать кортеж префиксов.

Ответ 2

for name in files:
    if not name.startswith("doc"):
        print name

Ответ 3

Если вы обнаружите, что функциональное программирование лучше соответствует вашему стилю, Python упрощает фильтрацию списков с помощью функции filter():

>>> files = ["doc1.html", "doc2.html", "doc3.html", "index.html", "image.jpeg"]
>>> filter_function = lambda name: not name.startswith("doc")
>>> filter(filter_function, files)
['index.html', 'image.jpeg']

Также взгляните на apply(), map(), reduce() и zip().

Ответ 4

похоже, эта проблема может быть лучше подходит для списка вещей так, как сказал Трой (хотя я предпочитаю поместить функцию непосредственно в фильтр)

filter(lambda filename: not filename.startswith("doc"),files)

или

[filename for filename in files if not filename.startswith("doc")]

Ответ 5

import os
os.chdir("/home")
for file in os.listdir("."):
   if os.path.isfile(file) and not file.startswith("doc"):
      print file

Ответ 6

Вы также можете использовать понимание списка.

cleaned_list = [filename for filename in files if not filename.startswith('doc')]

Ответ 7

Это мои 2 цента:
Немного понимания списка. Всегда лучше для эффективности.

file_list = [file for file in directory if not file.startswith(("name1", "name2", "name3"))]

Ответ 8

for name in files:
    if name[0:3] == "doc":
         continue

Ответ 9

Если все они начинаются с того же (то есть с "doc" ), вы можете использовать метод startswith() для строки python.

for name in files:
    if not name.startswith("doc"):
       print name

Ответ 10

Поскольку вы не сказали, что есть хорошие файлы, начинающиеся с "doc" и заканчивающиеся на ".html", вам придется объявить set плохие имена файлов и обработать только файлы, не входящие в этот набор.

bad_files = set(["doc1.html", "doc2.html", "doc3.html"])

for file in files:
  if file not in bad_files:
    print file

Если вам нужно динамически изменять список имен файлов, используйте list.

Ответ 11

Альтернативный подход к функциональному решению этой проблемы с преимуществом использования последних дополнений к стандартной библиотеке (с использованием тех же имен файлов, что и Troy J. Farrell, в другом ответе):

>>> import operator, itertools
>>> filter_fun= operator.methodcaller("startswith", "doc")
>>> files = ["doc1.html", "doc2.html", "doc3.html", "index.html", "image.jpeg"]
>>> list(itertools.ifilterfalse(filter_fun, files))
['index.html', 'image.jpeg']

operator.methodcaller, вызываемый с помощью methodname, [optional arguments], возвращает функцию, которая при вызове с объектом obj в качестве аргумента возвращает результат obj.methodname(optional_arguments). itertools.ifilterfalse, в отличие от filter, возвращает итератор вместо списка, и решение фильтра отрицается.

Ответ 12

Пропустите файлы, которые вы хотите исключить при переборе всех файлов, представленных в папке. Приведенный ниже код пропустит все HTML файлы, начинающиеся с 'doc'

import glob
import re
for file in glob.glob('*.html'):
    if re.match('doc.*\.html',file):
        continue
    else:
        #do your stuff here
        print(file)