Я пишу сценарий Python, который проходит каталог и собирает определенные файлы, но существует много файлов, которые я хочу исключенный, что все запускают то же.
Пример кода:
for name in files:
if name != "doc1.html" and name != "doc2.html" and name != "doc3.html":
print name
Скажем, существует 100 сотен файлов HTML в каталоге все начало 'doc'
. Каков был бы самый легкий способ исключить их?
Извините я плохо знаком с Python, я знаю, что это является, вероятно, основным.
Заранее спасибо.
if not name.startswith('doc'):
print name
Если у вас есть больше префиксов для исключения, вы даже можете сделать это:
if not name.startswith(('prefix', 'another', 'yetanother')):
print name
начинается с может принимать кортеж префиксов.
Если вы обнаружите, что функциональное программирование лучше соответствует вашему стилю, 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 ().
for name in files:
if name[0:3] == "doc":
continue
{{ 1}} import os
os.chdir("/home")
for file in os.listdir("."):
if os.path.isfile(file) and not file.startswith("doc"):
print file
Вы также можете использовать понимание списка .
cleaned_list = [filename for filename in files if not filename.startswith('doc')]
Если все они начинаются одинаково (т.е. с "doc"), вы можете использовать метод startwith () строки Python.
for name in files:
if not name.startswith("doc"):
print name
Поскольку вы не сказали, есть ли хорошие файлы, начинающиеся с «doc» и заканчивающиеся на «.html», вам придется объявить набор
из неправильные имена файлов и обрабатывать только файлы, не входящие в этот набор.
bad_files = set(["doc1.html", "doc2.html", "doc3.html"])
for file in files:
if file not in bad_files:
print file
Если вам нужно динамически изменять список имен файлов, используйте список
.
for name in files:
if not name.startswith("doc"):
print name
похоже, что эта проблема лучше подходит для работы со списком , как сказал Трой (хотя я предпочитаю помещать функцию непосредственно в фильтр)
filter(lambda filename: not filename.startswith("doc"),files)
или
[filename for filename in files if not filename.startswith("doc")]
Альтернативный вариант функционального решения этой проблемы с преимуществом использования недавних дополнений к стандартной библиотеке (с использованием тех же примеров имен файлов, что и у Троя Дж. Фаррелла в другом ответе):
>>> 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
, возвращает итератор вместо списка, и решение о фильтрации отменяется.
Когда вы думаете, что теперь вам стало сложнее управлять им и вы застряли.
-121--1587713-Согласно документации для символа запятой в MATLAB , одна из его функций состоит в разделении операторов в строке. Если в строке имеется только один оператор, запятая не требуется. Я не люблю видеть его там, хотя я знаю, что некоторые люди пишут код путь.
-121--2779436- Это мои 2 цента:
Немного понимания списка. Это всегда лучше для эффективности.
file_list = [file for file in directory if not file.startswith(("name1", "name2", "name3"))]