Одновременная обработка нескольких файлов dxf на Python
Написал программу, которая перебирает чертежи, вносит изменения и сохраняет файл с тем же именем, но в другом каталоге (в папке old
— старые чертежи, в new
— новые). Исходник остаётся без изменений.
Здесь всё делается по очереди:
- открытие файла
- поиск объектов
- внесение изменений
- пересохранение файла
Вот код:
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, 'успех')
просто для красоты. Чтобы это несло смысл, надо эту конструкцию поместить в обработчик ошибок? Имеет ли смысл это сделать декоратором?