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

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

Пример кода:

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

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

Извините я плохо знаком с Python, я знаю, что это является, вероятно, основным.

Заранее спасибо.

12
задан Peter Hansen 4 February 2010 в 01:26
поделиться

11 ответов

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

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

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

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

24
ответ дан 2 December 2019 в 03:43
поделиться

Если вы обнаружите, что функциональное программирование лучше соответствует вашему стилю, 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 ().

5
ответ дан 2 December 2019 в 03:43
поделиться
for name in files:
    if name[0:3] == "doc":
         continue
{{ 1}}
0
ответ дан 2 December 2019 в 03:43
поделиться
import os
os.chdir("/home")
for file in os.listdir("."):
   if os.path.isfile(file) and not file.startswith("doc"):
      print file
1
ответ дан 2 December 2019 в 03:43
поделиться

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

cleaned_list = [filename for filename in files if not filename.startswith('doc')]
1
ответ дан 2 December 2019 в 03:43
поделиться

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

for name in files:
    if not name.startswith("doc"):
       print name
0
ответ дан 2 December 2019 в 03:43
поделиться

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

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

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

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

0
ответ дан 2 December 2019 в 03:43
поделиться
for name in files:
    if not name.startswith("doc"):
        print name
5
ответ дан 2 December 2019 в 03:43
поделиться

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

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

или

[filename for filename in files if not filename.startswith("doc")]
3
ответ дан 2 December 2019 в 03:43
поделиться

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

>>> 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 вызывается с имя метода, [необязательные аргументы] возвращает функцию, которая при вызове с объектом obj в качестве аргумента возвращает результат obj.methodname (optional_arguments) . itertools.ifilterfalse , в отличие от filter , возвращает итератор вместо списка, и решение о фильтрации отменяется.

0
ответ дан 2 December 2019 в 03:43
поделиться

Когда вы думаете, что теперь вам стало сложнее управлять им и вы застряли.

-121--1587713-

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

-121--2779436-

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

file_list = [file for file in directory if not file.startswith(("name1", "name2", "name3"))]
1
ответ дан 2 December 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: