Как получить доступ к последнему имени файла в каталоге в Python
Я пытаюсь перебрать некоторые файлы в каталоге. Если имя файла содержит две конкретные строки вместе, то я должен открыть и прочитать эти файлы для информации. Однако, если ни один из файлов не имеет этих двух строк, я хочу напечатать сообщение об ошибке только один раз.
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 ответа
Простым решением было бы инициализировать некоторый логический флаг перед циклом for, например found = false
Если вы найдете файл, установите found = true
, Затем вы можете проверить значение found
после завершения цикла for и выведите соответствующее сообщение в зависимости от его значения.
Отфильтруйте список файлов перед 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*')
Не уверен, что это экстремально. Но я бы сделал это функцией и поднял 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
Другой способ - использовать переменную, чтобы проверить, все ли файлы были обработаны. Проверено и найдено, что это работает в 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")