2015-12-04 2 views
0

Я работаю над кодом в python, который будет просматривать тысячи текстовых файлов для определенных строк, а затем добавлять имена этих текстовых файлов в один из двух списков. Я пытаюсь сделать это с помощью, если оператор с несколькими аргументами, как это:Проверка текстовых файлов для определенных строк в python

# up here would be other code 
    # 
with open("/home/textfile.txt", 'r') as f: 
     textfile = f.read() 
if "this phrase" in textfile or "that phrase" in textfile and not "not this phrase" in textfile and not "not that phrase" in textfile: 
    return True 
elif "not this phrase" in textfile or "not that phrase" in textfile: 
    return False 

Сейчас в моем коде есть много аргументов больше в них, если заявления, но по какой-то причине, когда я получаю список текстовых файлов, содержат «эту фразу» или «эту фразу», некоторые из них также содержат «не эту фразу». Почему это происходит? Это потому, что я использую слишком много аргументов в выражении if? Основной целью программы является добавление имени текстового файла в один список в зависимости от того, возвращается ли True или False к основной функции.

+0

Что такое 'textfile'? –

+0

Это строка, содержащая информацию из текстового файла. Здесь я быстро отредактирую вопрос. –

ответ

2

Вы должны группировать условия должным образом, например:

if (
    ("this phrase" in textfile or "that phrase" in textfile) and not (
    "not this phrase" in textfile or "not that phrase" in textfile) 
): 
    return True 
0

согласен с ответом Ника. Но вы сказали, что в операторах if есть много других аргументов, поэтому вы не хотите писать все эти утверждения в цикле if.

Предлагаю использовать два списка. Вот пример кода.

ПРИМЕЧАНИЕ. Помните, что это быстрое и грязное решение. Вы можете импровизировать это, используя генераторы вместо списков (если количество ваших шаблонов велико), используйте лямбда-функции, чтобы уменьшить количество строк (хотя выглядит сложным) и т. Д. В соответствии с вашими предпочтениями.

contain_lst = ['pattern1', 'p2', 'p3'] 
not_contain_lst = ['ncp1', 'ncp2', 'ncp3', 'ncp4'] 
for each_file in files_list: 
    with open(each_file) as f: 
     data = f.read() 
    contain_match = 1 
    for each_contain_pattern in contain_lst: 
     if each_contain_pattern in data: 
      contain_match = 0 
    not_contain_match = 0 
    for each_not_contain_pattern in not_contain_lst: 
     if each_not_contain_pattern in data: 
      not_contain_match = 1 
    if contain_match and not not_contain_match: 
     print "File %s has all the needed patterns and doesn't have the not needed patterns" % each_file 
    else: 
     print "ERROR- File %s doesn't match the requirements" % each_file 
Смежные вопросы