Как получить доступ к последнему имени файла в каталоге в Python - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь перебрать некоторые файлы в каталоге.Если имя файла содержит две конкретные строки вместе, то я должен открыть и прочитать эти файлы для информации.Однако, если ни один из файлов не имеет этих двух строк, я хочу напечатать сообщение об ошибке только один раз.

for filename in os.listdir(directory):
   if filename.find("<string1>") != -1 and filename.find("<string2>") != -1:
      #open file
   else:
      #print error message

Я знаю, что при этом будет напечатано столько сообщений об ошибках, сколько файлов в каталоге (т.е.если есть 15 файлов без совпадений, я получу 15 сообщений об ошибках).Но я хочу напечатать сообщение об ошибке только один раз после того, как нет совпадений ни в одном из N файлов в каталоге.Я подумал, что мог бы сделать что-то вроде этого:

for filename in os.listdir(directory):
   if filename.find("<string1>") != -1 and filename.find("<string2>") != -1:
      #open file
   else:
      if filename[-1]: #if filename is last in directory
         #print error message

Но я обнаружил, что это не работает.Как получить сообщение об ошибке для печати только после прочтения последнего имени файла и его несоответствия?

Ответы [ 4 ]

0 голосов
/ 31 января 2019

Не уверен, что это экстремально.Но я бы сделал это функцией и поднял IOError.Кроме того, я бы всегда использовал абсолютный путь.Попробуйте модуль pathlib тоже

import os

def get_files(directory):
    for filename in os.listdir(directory):
        if "string1" in filename and "string2" in filename:
             yield filename
    raise IOError("No such file")

for file in get_files('.'):
    print(file)
    # do stuff with file
0 голосов
/ 31 января 2019

Фильтрация списка файлов перед for -loop:

filenames = [fname for fname in os.listdir(directory) 
             if '<string1>' in fname and '<string2>' in fname]
if filenames:
    for filename in filenames:
        #open file
else:
    #print error message

Вы также можете использовать модуль glob для получения имен файлов:

import glob
filenames = glob.glob(directory + '/*string1*string2*')
0 голосов
/ 31 января 2019

Другой способ - использовать переменную, чтобы проверить, все ли файлы были обработаны.Проверено и найдено, что оно работает в Python 2.7

import os

directory = "E:\\test\\"
files_count = len(os.listdir(directory))
files_processed = 0
for filename in os.listdir(directory):
   if 'string1' in filename and 'string2' in filename:
      #open file
      print ("Opening file")
   else:
    files_processed = files_processed + 1
    if (files_processed >= files_count):
        print ("error message")
0 голосов
/ 31 января 2019

Простым решением было бы инициализировать некоторый логический флаг перед циклом for, например, found = false

Если вы найдете файл, установите found = true.Затем вы можете проверить значение found после завершения цикла for и распечатать соответствующее сообщение на основе его значения.

...