Рубрики
Без рубрики

Наблюдатель над каталогами за 5 минут

Я инженер -механик, специализирующийся на «NVH» (суровость вибрации шума). В некоторых случаях, Когда мы … помечены питоном, производительность, программирование, учебник.

Я инженер -механик, специализирующийся на «NVH» (суровость вибрации шума). В некоторых случаях, когда мы пытаемся проверить механический компонент, мы должны провести много измерений в течение длительного периода времени. Измерения NVH требуют много дискового пространства и в то же время высокоскоростной операции записи. Вот почему я решил написать код, который помогает мне автоматически копировать или перемещать файлы из данного каталога (локальный) в другой (сеть), в зависимости от возраста и типа файла или имени.

Для этого я решил использовать Python в качестве языка программирования и не использовать ни одной библиотеки. Вы можете клонировать это из https://github.com/tmeftah/dir-watcher

import configparser

config = configparser.ConfigParser(allow_no_value=True)
config.read('conf.cfg')

Создайте файл conf.cfg

[SETTING]
timeinterval =  10
src_path = /dir_to_watch/*.txt
dist_path = /dir_to_save_to/test
operation = copy
  • TimeInterval много минут показывают файл быть
  • src_path Путь источника, где искать конкретный шаблон файла
  • dist_path папка с дистинацией, где файлы должны быть перемещены/скопированы в
  • Операция = ‘Копия’ для копирования/вставки или ‘Move’ разрезать/прошло
# app.py
.
..
...

timeinterval = int(config.get('SETTING', 'timeinterval'))
src_path = config.get('SETTING', 'src_path')
dist_path = config.get('SETTING', 'dist_path')
operation = config.get('SETTING', 'operation')
# app.py
.
..
...

file_list = glob.glob(src_path) # get all files in scr_path folder

шаблон поиска на src_path устанавливаются в соответствии с пакетом Python “Glob.glob”. Для получения дополнительной информации, пожалуйста, посмотрите https://docs.python.org/3/library/glob.html

# app.py
.
..
...
for file in file_list:
    file_datetime = datetime.fromtimestamp(os.path.getctime(file))
    filename = os.path.basename(file)    
    now = datetime.now()
    diff = now - file_datetime

    if diff.seconds > timeinterval :

        if operation == "copy":
            file_exist = os.path.isfile(os.path.join(dist_path,filename))                    
            if  file_exist:
                next
            else:
                try:
                    shutil.copy(file,os.path.join(dist_path,filename))
                    logging.info(f'file {filename} is copied successfully')                                                       
                except shutil.Error :
                    logging.error(f'copy file {filename} failed')
                    next

        if operation == "move":
            try:
                shutil.move(file,os.path.join(dist_path,filename))
                logging.info(f'file {filename} is moved successfully')
            except shutil.Error:
                logging.error(f'moving file {filename} failed')
                next

Я добавляю тот же регистратор и отпечатки, чтобы отслеживать, что сделал этот сценарий

import os
import sys
import glob
from datetime import datetime
import time
import shutil
import configparser
import logging
import ctypes


# set title of the console window
ctypes.windll.kernel32.SetConsoleTitleW("Dir-Watcher by Tarek Meftah")

logging.basicConfig(filename='log.log', filemode='a', format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',level=logging.INFO)


config = configparser.ConfigParser(allow_no_value=True)
config.read('conf.cfg')

timeinterval = int(config.get('SETTING', 'timeinterval'))
src_path = config.get('SETTING', 'src_path')
dist_path = config.get('SETTING', 'dist_path')
operation = config.get('SETTING', 'operation')


logging.info(100*'*')
logging.info('start watching')
logging.info(f'src_path = {src_path}')
logging.info(f'dist_path = {dist_path}')
logging.info(f'operation = {operation}')
logging.info(100*'*')

print()
print()
print(100* '*')
print()
print('      created by Tarek Meftah ')
print('      watch folder for changes and copy or move files to another distination folder.')
print()
print(100* '*')
print()
print()
print(f'     +    watching folder {src_path} for change ')
while True:
    try:
        file_list = glob.glob(src_path) # get all files in scr_path folder

        for file in file_list:
            file_datetime = datetime.fromtimestamp(os.path.getctime(file))
            filename = os.path.basename(file)    
            now = datetime.now()
            diff = now - file_datetime

            if diff.seconds > timeinterval :

                if operation == "copy":
                    file_exist = os.path.isfile(os.path.join(dist_path,filename))                    
                    if  file_exist:
                        next
                    else:
                        try:
                            shutil.copy(file,os.path.join(dist_path,filename))
                            logging.info(f'file {filename} is copied successfully')                                                       
                        except shutil.Error :
                            logging.error(f'copy file {filename} failed')
                            next

                if operation == "move":
                    try:
                        shutil.move(file,os.path.join(dist_path,filename))
                        logging.info(f'file {filename} is moved successfully')
                    except shutil.Error:
                        logging.error(f'moving file {filename} failed')
                        next

        time.sleep(1)
    except KeyboardInterrupt:    
        confirm = input('Enter "yes" to cancel or "no" to keep running [yes/no]:').strip().lower()
        if confirm == 'yes' or confirm == "y":            
            logging.info(47* '*'+' Exit '+47* '*' +'\n')            
            break

        elif confirm == 'no' or confirm == "n":
            print("     + Keep runnning!")
            continue
        else:
            print ('    + Sorry, no valid answer...')
            continue
    except Exception as e:
         logging.error(f'error: {e.message} ')

Надеюсь, вы сможете использовать этот скрипт на своей ежедневной работе. Я использовал Pyinstaller Чтобы сгенерировать исполняемый файл, который я могу использовать его там, где я хочу, и не нужно устанавливать Python.

Оригинал: “https://dev.to/tmeftah/dir-watcher-4g32”