Одновременная обработка нескольких файлов dxf на Python

Написал программу, которая перебирает чертежи, вносит изменения и сохраняет файл с тем же именем, но в другом каталоге (в папке old — старые чертежи, в new — новые). Исходник остаётся без изменений.

Здесь всё делается по очереди:

  1. открытие файла
  2. поиск объектов
  3. внесение изменений
  4. пересохранение файла

Вот код:

import os
import glob
import ezdxf
from google.colab import drive
drive.mount('/content/drive', force_remount=True)

# Путь к каталогу с чертежам
old_dir_path = '/content/drive/My Drive/dxf_editor/old'
new_dir_path = '/content/drive/My Drive/dxf_editor/new'

# Перебираем все файлы в старом каталоге с расширением .dxf
for file in glob.glob(os.path.join(old_dir_path, '*.dxf')):
    # Открываем чертеж
    doc = ezdxf.readfile(file)
    msp = doc.modelspace()
    all_lines = msp.query('LWPOLYLINE')
    # разбиваем сложные объекты
    for polyline in all_lines:
        for line in polyline.explode():
            # ищем арки и строим окружности
            if line.DXFTYPE == 'ARC':
                radius = line.dxfattribs()['radius'] 
                center = line.dxfattribs()['center']
                if abs(radius - 17.8) <= 0.01:
                    msp.add_circle(center, 19.3)
                elif abs(radius - 16.2) <= 0.01:
                    msp.add_circle(center, 17.6)
    # Сохраняем изменения как новый файл
    new_file = os.path.join(new_dir_path, os.path.basename(file))
    doc.saveas(new_file)
    print(file, 'успех')

В связи с этим возникли следующие вопросы:

Вопрос 1: как это распараллелить? Возможно ли? Тестировал на 50 файлах, выполнялось около 15-20 секунд (не считая загрузки / выгрузки с гугл диска), но что если файлов будет больше 1000? Можно ли условно в разных потоках запускать итерации главного цикла?

Вопрос 2: как сделать поиск файлов не только в заданном каталоге, но и подкаталогах, и чтобы новые файлы сохранили "путь"? Я скормлю скрипту рабочий каталог, и хотел бы получить измененные файлы не в перемешку, а с подпапками, как они размещены в оригинале.

Вопрос 3: сейчас у меня print(file, 'успех') просто для красоты. Чтобы это несло смысл, надо эту конструкцию поместить в обработчик ошибок? Имеет ли смысл это сделать декоратором?


Ответы (0 шт):