В 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)