Выбрать все файлы из каталога за исключением определенных
for file in glob.glob(patch+'*.*'):
if not result or file.endswith('.filepart'):
continue
В данный момент делаю так, берем все файлы в каталоге, через условие смотрим на имя. Если в имени содержится(расширение за основным) filepart
к примеру name.txt.filepart
. Пропускаем цикл...
Вопрос в том, как заранее в glob.glob(patch+'*.*')
прописать выражение, которое сразу отсеет те файлы в имени которых есть filepart
.
filepart
добавляется тогда когда в каталог через ftp закачивается файл. Кидаю через WinSCP, возможно если через другие ftp клиенты кидать, будет другое имя. Как в целом определить что данный файл находиться в процессе загрузки?
Ответы (2 шт):
Чтобы выбрать все файлы из каталога за исключением определенных, например, тех, которые имеют в имени .filepart
, можно использовать модуль glob
вместе с фильтрацией файлов для исключения тех, что содержат определенное подстроку.
Решение с использованием glob
и фильтрации
К сожалению, glob
не поддерживает сложные шаблоны с исключениями, поэтому вам все равно придется фильтровать результаты после получения списка файлов. Вот пример:
import glob
import os
# Путь к каталогу
patch = '/path/to/directory/' # Укажите ваш путь
# Получаем все файлы в каталоге
files = glob.glob(patch + '*.*')
# Фильтруем файлы, исключая те, которые содержат ".filepart"
filtered_files = [file for file in files if '.filepart' not in os.path.basename(file)]
# Выводим отфильтрованные файлы
for file in filtered_files:
print(file)
Определение файлов в процессе загрузки
Файлы, которые находятся в процессе загрузки, часто имеют определенные паттерны в своих именах. В вашем случае это .filepart
. Если вы хотите более надежный способ определения таких файлов, можно использовать:
- Расширения: Как вы уже указали, если в имени файла присутствует
.filepart
, то его можно считать загружаемым. - Время создания: Если файл создан совсем недавно, это может означать, что он еще загружается.
- Размер файла: Если размер файла не меняется в течение некоторого времени, это может указывать на завершение загрузки.
Пример кода, учитывающий время создания файла:
import glob
import os
import time
# Путь к каталогу
patch = '/path/to/directory/' # Укажите ваш путь
# Получаем все файлы в каталоге
files = glob.glob(patch + '*.*')
# Фильтруем файлы, исключая те, которые содержат ".filepart" или были созданы совсем недавно
filtered_files = []
for file in files:
if '.filepart' not in os.path.basename(file):
# Проверка времени создания файла
creation_time = os.path.getctime(file)
# Если файл создан более 5 минут назад, добавляем его в список
if time.time() - creation_time > 300: # 300 секунд = 5 минут
filtered_files.append(file)
# Выводим отфильтрованные файлы
for file in filtered_files:
print(file)
Получение списка файлов в каталоге и подкаталогах, исключая некоторые типы:
import os
print("-" * 50 + "\nСписок файлов в заданном каталоге:\n" + "-" * 50)
# Каталог для поиска:
directory = r"d:\documents"
# Список всех файлов в каталоге и подкаталогах, исключая .docx:
files = [os.path.join(root, file) for root, dirs, files in os.walk(directory) for file in files if not file.endswith(".docx")]
# Вывод списка файлов на экран:
for file in files: print(file)
print("\nНажмите любую клавишу для продолжения...")
os.system("pause > nul" if os.name == "nt" else "read > /dev/null")
Такой подход, кстати, позволяет исключать несколько типов файлов, просто расширяя конструкцию if not file.endswith(".docx")
Определение того, является ли файл в процессе загрузки, из другой оперы и это не нужно решать с помощью каких-то безумных алгоритмов. Это из серии грамотного и простого управления файловыми операциями. Я не буду тут мусолить эту тему, извините.