2017-01-13 3 views
1

Мне нужно проверить тысячи каталогов для двух видов файлов. Я ограничил индекс, или idx, до менее четырех, так как в этом диапазоне будут найдены два типа файлов, которые нужно найти: «jpg» и «.mb». Но мне нужно, чтобы оператор if требовал, чтобы эти два типа файлов находились в каталоге. Если заявление:Использование операторов «и» в if

if ('.jpg' in val) and ('thmb' in val): 

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

Data missing W:\\North2015\200\10 200001000031.jpg 0 
Data missing W:\\North2015\200\10 200001000032.jpg 1 
Data missing W:\\North2015\200\100 200014000001.jpg 0 
Data missing W:\\North2015\200\100 200014000002.jpg 1 
Data missing W:\\North2015\200\101 200014100081.jpg 2 

Вот код ниже:

def missingFileSearch(): 
    for folder in setFinder(): 
     for idx,val in enumerate(os.listdir(folder)): 
      if idx < 4: 
       if ('.jpg' in val) and ('thmb' in val): 
        pass 
       else: 
        print'Data missing',folder,val,idx 

Так что мне интересно, почему я получаю вывод через инструкцию else. Кроме того, эта строка кода повесила:

if val.endswith('.jpg') and ('thmb' in val): 
    print'Data is here!',folder,val,idx 

Это в основном то, что мне нужно код, чтобы сделать.

+1

'' 200001000031.jpg'' не содержит '' thmb''. Вы имели в виду ваше условие быть 'if ('.jpg' в val) или ('thmb' in val):' ('или' вместо' and')? –

+0

Ну, я думаю, что если я использую 'или' вместо 'и', он будет удовлетворять условию, если какой-либо файл находится в каталоге, но не оба. –

+2

@hollow_Victory: вы тестируете * каждое имя файла *, а не * все имена файлов *. –

ответ

1

Я хотел бы сделать это:

def missingFileSearch(): 
    folders_with_missing = [] 
    for folder in setFinder(): 
     thmb_found = False 
     jpg_found = False 
     for fname in os.listdir(folder): 
      thmb_found |= 'thmb' in fname 
      jpg_found |= fname.endswith('.jpg') 
      if thmb_found and jpg_found: 
       break # break inner loop, move on to check next folder 
     else: # loop not broken 
      if not thmb_found and not jpg_found: 
       desc = "no thmb, no .jpg" 
      elif not thmb_found: 
       desc = "no thmb" 
      else: 
       desc = "no .jpg" 
      folders_with_missing.append((folder, desc)) 
    return folders_with_missing 

Я испытал немного измененную версию этого кода (без setFinder() функции):

def missingFileSearch(): 
    folders_with_missing = [] 
    for folder in os.listdir(my_dir): 
     thmb_found = False 
     jpg_found = False 
     for fname in os.listdir(os.path.join(my_dir, folder)): 
      thmb_found |= 'thmb' in fname 
      jpg_found |= fname.endswith('.jpg') 
      if thmb_found and jpg_found: 
       break # break inner loop, move on to check next folder 
     else: # loop not broken 
      if not thmb_found and not jpg_found: 
       desc = "no thmb, no .jpg" 
      elif not thmb_found: 
       desc = "no thmb" 
      else: 
       desc = "no .jpg" 
      folders_with_missing.append((folder, desc)) 
    return folders_with_missing 

Я создал четыре тестовые папки с Пояснений именами:

>>> os.listdir(my_dir) 
['both_thmb_jpg', 'missing_jpg', 'missing_thmb', 'no_files'] 

Затем была запущена функция:

>>> missingFileSearch() 
[('missing_jpg', 'no .jpg'), ('missing_thmb', 'no thmb'), ('no_files', 'no thmb, no .jpg')] 
+0

Это хорошо работает, но файлы, заканчивающиеся на «.jpg», все еще проскальзывают. Таким образом, у нас все еще есть та же проблема. –

+0

Я попытался добавить jpg_end = False, затем jpg_end | = fname.endswith ('. Jpg'), и он все равно сделал то же самое –

+0

@hollow_Victory: Пожалуйста, объясните подробнее. У вас есть каталоги, в которых отсутствует один из '' .jpg'' и '' thmb'', которые не попадают? –

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