Выбрать все файлы из каталога за исключением определенных

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 шт):

Автор решения: Matvj

Чтобы выбрать все файлы из каталога за исключением определенных, например, тех, которые имеют в имени .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. Если вы хотите более надежный способ определения таких файлов, можно использовать:

  1. Расширения: Как вы уже указали, если в имени файла присутствует .filepart, то его можно считать загружаемым.
  2. Время создания: Если файл создан совсем недавно, это может означать, что он еще загружается.
  3. Размер файла: Если размер файла не меняется в течение некоторого времени, это может указывать на завершение загрузки.

Пример кода, учитывающий время создания файла:

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)
→ Ссылка
Автор решения: Fox Fox

Получение списка файлов в каталоге и подкаталогах, исключая некоторые типы:

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")

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

→ Ссылка