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

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

Пример кода:

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

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

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

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

Ответы [ 12 ]

23 голосов
/ 03 февраля 2010
if not name.startswith('doc'):
     print name

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

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

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

5 голосов
/ 03 февраля 2010
for name in files:
    if not name.startswith("doc"):
        print name
4 голосов
/ 03 февраля 2010

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

2 голосов
/ 03 февраля 2010

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

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

или

[filename for filename in files if not filename.startswith("doc")]
1 голос
/ 08 февраля 2010

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

file_list = [file for file in directory if not file.startswith(("name1", "name2", "name3"))]
1 голос
/ 03 февраля 2010

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

cleaned_list = [filename for filename in files if not filename.startswith('doc')]
1 голос
/ 03 февраля 2010
import os
os.chdir("/home")
for file in os.listdir("."):
   if os.path.isfile(file) and not file.startswith("doc"):
      print file
0 голосов
/ 27 июня 2019

Пропускать файлы, которые вы хотите исключить при переборе всех файлов, присутствующих в папке. Приведенный ниже код пропустит все 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)
0 голосов
/ 04 февраля 2010

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

>>> 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, возвращает итератор вместо списка, и решение фильтра отменяется.

0 голосов
/ 03 февраля 2010

Поскольку вы не сказали, есть ли хорошие файлы, начиная с '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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...