2016-09-06 2 views
1

Я только что прочитал блестящий ответ от Sloth по адресу Remove lines that contain certain string вопрос во время поиска способа фильтрации мусорных строк в файле txt/csv. Суть заключается в том, чтобы «взять x y z слова/строки/независимо от входного файла, а затем фильтровать каждую строку, набирая только нефильтрованные строки».Python 2.7 если не какой-либо синтаксис?

код он отвечал был:

bad_words = ['bad', 'naughty'] 

with open('oldfile.txt') as oldfile, open('newfile.txt', 'w') as newfile: 
for line in oldfile: 
    if not any(bad_word in line for bad_word in bad_words): 
     newfile.write(line) 

Мой вопрос: Будет ли кто-нибудь объяснить линию if not any(bad_word in line for bad_word in bad_words):?

Я пробовал просто положить if not any(bad_word in line):, но это дало мне ошибку.

Я пытаюсь понять, почему. Беглый поиск на веб-странице python docs не помог мне (я новичок в Python/программировании и, возможно, не слишком яркий для загрузки :-)).

Любые ссылки на меня для чтения оцениваются.

Спасибо!

+2

Возможный дубликат [Как работают все и все функции Python?] (Http://stackoverflow.com/questions/19389490/how-do-pythons-any-and-all-functions-work) – Celeo

+0

Спасибо, я проверяю эту страницу. Вы должны быть быстрым читателем, вы ответили почти сразу после моего опубликования. –

ответ

0

ли кто-нибудь объяснить линии if not any(bad_word in line for bad_word in bad_words)

Конечно.

bad_word in line for bad_word in bad_words - это так называемый list comprehension. В принципе, это строка кода, которая генерирует список. Это эквивалентно:

list1 = [] 
for bad_word in bad_words: 
    if bad_word in line: 
     list1.append(True) 
    else: 
     list1.append(False) 

if not any(list1): 
    newfile.write(line) 

Я попытался просто положить в if not any(bad_word in line):, но он дал мне ошибку

Да, потому что any принимает список в качестве входных данных, и вы предоставили итератор. Попробуйте что-нибудь вроде if not any([True, False, True]):

+0

Большое спасибо за руку. –

+0

@ArkhamAngel не стесняйтесь повышать и/или принимать ответ – RPGillespie

+5

«bad_word in line for bad_word in bad_words» - это генератор, а не список. – abc

Смежные вопросы