OpenFile

Автор Ципихович Эндрю, 2 января 2024, 21:38

0 Пользователи и 1 гость просматривают эту тему.

Ципихович Эндрю

финальный код:
# -*- coding: utf-8 -*-
# Скрипт для LibreOffice

import os # позволяет работать с файловой системой
from datetime import datetime # позволяет работать с датой
import uno # позволяет открыть файл

def Helpik():
    """Prints the string 'Hello World (in Python)' into the current document."""
    """Печатает строку 'Hello World (in Python)' в текущий документ."""
    # Get the doc from the scripting context which is made available to all scripts.
    # Получите документ из контекста сценария, который доступен для всех сценариев.
    desktop = XSCRIPTCONTEXT.getDesktop()
    model = desktop.getCurrentComponent()
    # Check whether there's already an opened document.
    # Otherwise, create a new one
    # Проверяем, существует ли уже открытый документ.
    # В противном случае создайте новый
    if not hasattr(model, "Text"):
        model = desktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, ())
    # get the XText interface
    # получаем интерфейс XText
    text = model.Text
    # create an XTextRange
    # создаём XTextRange
    # в конце документа
    # tRange = text.End
    # в начале документа
    # tRange = text.Start
    # на весь документ
    tRange = text
    tRange.String = '' # очищаем документ
    tRange = text.End
    date_start = datetime.now()
    disk = 'i'
    patch_doc = disk + ':/Российская Федерация/'
    if os.path.isdir(patch_doc):# если папка=каталог=директория существует
        filelst = [file for file in os.listdir(patch_doc) if os.path.isfile(f'{patch_doc}/{file}')] # получить список файлов
        def keyFunc(x): # => функция, которая сортирует по принципу: ['1.text', '2.text', '10.text']
            return int(x.split('.')[0])
        if len(filelst) != 1: filelst.sort(key=keyFunc)
        HtmFileCount = 0
        NBSPcount = 0
        ctx = uno.getComponentContext()
        smgr = ctx.ServiceManager
        desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)
        for l in filelst:
            txt = ''
            if l.lower().endswith('.htm'):
                HtmFileCount += 1
                doc = desktop.loadComponentFromURL('file:///' + patch_doc + l, '_blank', 0, ()) # открыть файл
                txt = str(doc.Text.String) + '\n' + '+++++++++++++++++++++++++++++++++++++++++++++' + '\n'
                doc.dispose() # закрыть файл
                NBSPcount = NBSPcount + txt.count(' ')
                txt = txt.replace(' ', ' ')
                tRange.String = txt # вставить текст с файла в текущий документ
        date_end = datetime.now()
        tRange.String = f'Начато: {str(date_start)}\n' \
                        f'Окончено: {str(date_end)}\n' \
                        f'Продолжительность работы программы: {str(date_end - date_start)}\n' \
                        f'Вставлено документов в текущий документ: {HtmFileCount}\n' \
                        f'Количество сделанных замен   на пробел: {NBSPcount}'
    else: tRange.String = f'Папка: {patch_doc} отсутствует\n' \
                          f'Далее программа продолжаться не будет'
    return None
но что-то не очень ....
понятно что документы разные по величине, всего их в папке 30
может для переменной txt есть ограничение по её длине, но документы вставляются НЕ целиком, окончание некоторых больших документов не вставлены, так-что нужно присмотреться как документы вставляются макросом бейсика полностью или нет и как вставляются питоном без либры....
по скорости оба решения почти одинаково работают около 10 мин и питоном и бейсиком

economist

#61
Цитата: Ципихович Эндрю от  9 января 2024, 10:09но что-то не очень ....

Не мудрено. Куча мусора в коде, до конца условия задачи не ясны, зачем-то HTML итд. Вот пример ясного подхода:

Задача: в Консультант+ есть Налоговый кодекс из 2-х частей (1k страниц). Или просто много документов, сохраненных в TXT. Нужно получить один файл с сохранением абзацев, максимально просто и быстро.

Решение: пишем простой код на Python, объединяющий TXT-файлы.
from glob import glob

out = []
for txt in glob('D:/НК/*.txt'):
    with open(txt, 'r') as f:
         out.append(f.read())

out = '\n'.join(out)
with open('D:/НК/out.txt', 'w') as f:
    f.write(out)

Время написания кода: 5 минут
Время выполнения кода: 2 секунды (для Налогового кодекса :-)
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Ципихович Эндрю

у меня в распоряжении есть только htm файлы, они мне нужны - качать в двух, трёх форматах считаю не целесообразным
задача была взять htm файлы из папки открыть их либрой и то, что видно глазу на экране монитора соединить в один файл и сохранить в текстовом файле при этом не нарушить структуру - имеется ввиду переносы чтобы сохранились
эти файлы вордом НЕ открыть - он падает, ХЗ почему, я выяснил, что из-за наличия Chr(160) в документе

economist

Чтобы решить задачу соединения текста со всей структурой (абзацы) и "с переносами" - нужно скачать файлы из К+ в одном формате, Ctrl+S "Текст в формате Unicode". Остальное сделает мой код из #61, который проще некуда и заработает сразу.

 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Ципихович Эндрю

спасибо понял, когда у меня будет доступ к К+ обращу внимание на
Цитата: economist от  9 января 2024, 14:07Ctrl+S "Текст в формате Unicode"
познакомлюсь что это такое и с чем его едят
в тоже время я вам говорю о том, что
Цитата: Ципихович Эндрю от  9 января 2024, 13:58у меня в распоряжении есть только htm файлы, они мне нужны - качать в двух, трёх форматах считаю не целесообразным


economist

У всех людей есть возможность скачать за секунды любой файл из ПО К+ или (бесплатно для кодексов, законов и пост. ПРФ) с сайта consultant.ru в формате TXT и легко решить задачу (объединения текста) с помощью кода из #61.   

Формат HTML от К+ отличается тем что содержит гиперссылки, эл-ты верстки, ссылки на картинки и много мусора.

Python может всё, в т.ч. читать любой, даже очень "грязный" HTML, нужно лишь поправить пару строк в коде выше или использовать высоко-уровневые библиотеки. Но тема "мусора" неисчерпаема и с такими темпами прояснения условий задачи - что считать мусором станет ясно к 2025 году ;)

Использовать LO можно для всего, но объединение HTML-файлов в один TXT - явно не для него задача. Хотя и ее можно решить, чисто в академическом интересе.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Ципихович Эндрю

Цитата: economist от  9 января 2024, 14:38У всех людей есть возможность скачать за секунды любой файл из ПО К+ или (бесплатно для кодексов, законов и пост. ПРФ) с сайта consultant.ru
бесплатный доступ даётся раз в полгода на три дня
Цитата: economist от  9 января 2024, 14:38Использовать LO можно для всего, но объединение HTML-файлов в один TXT - явно не для него задача. Хотя и ее можно решить, чисто в академическом интересе.
к макросу написанному на бейсике нет вопросов - всё делает верно за 10 мин. склеивает 30 документов без ошибок и потерь - файл получается 10788 страниц
а вот после того, как я переписал макрос на питон к результату есть вопросы
так что из двух скриптов я выберу бейсик
и получается, что я переписал с бейсика на питон чисто в академическом интересе))
если бы питон вписался примерно так-же в ворд я бы НЕ обиделся, а так в новостях я читал что скоро или уже сделали, но что и как там сделано или сделают пока для меня загадка

sokol92

Цитата: economist от  9 января 2024, 14:38У всех людей есть возможность скачать за секунды любой файл из ПО К+ или (бесплатно для кодексов, законов и пост. ПРФ) с сайта consultant.ru в формате TXT и легко решить задачу (объединения текста) с помощью кода из #61. 
Цитата: Ципихович Эндрю от  9 января 2024, 15:31бесплатный доступ даётся раз в полгода на три дня

Поддержу первое утверждение. В выходные дни круглосуточно, в рабочие - вечером.
Владимир.

Ципихович Эндрю

ну значит они вернулись к старой практике так у них было давным-давно, а потом сделали как я уже говорил
бесплатный доступ даётся раз в полгода на три дня
это как говорят пожилые люди завлекалочка - сто пудов потом жаба их начнёт душит и снова будет:
бесплатный доступ даётся раз в полгода на три дня
одним словом ничего постоянного\вечного нет

Ципихович Эндрю

Цитата: sokol92 от  9 января 2024, 15:43Поддержу первое утверждение. В выходные дни круглосуточно, в рабочие - вечером.
и толку от этого расписания, я попробовал сейчас войти
так как сказано по ссылке
Только основные документы  V
получил отказ


sokol92

#70
Сегодня рабочий день, входите в интервале 20-24 (мск) по моей ссылке (а не по Вашей).
Владимир.

economist

Кодексы, Законы, ППР доступны 24/7: https://www.consultant.ru/online/raspisanie/ Это не все что есть в 50 Гб+ текстов, но если нужно всё - то платная подписка (30-150k в мес.) Но еще есть Гарант, Эталон, 250+ сайтов органов зак. и исп. власти, в общем файлы доступны. Текстовую агрегацию правовых актов делают некоторые бесплатные онлайн-сервисы (а также агрегацию ЕГРЮЛ), искать лень.

Цитата: Ципихович Эндрю от  9 января 2024, 15:31а вот после того, как я переписал макрос на питон к результату есть вопросы
- какие именно? И куда подевались вопросы к Basic в виде обрыва документов?

Мне важно чтобы читающие ветку шли не по граблям, а видели работающее решение. В Питоне в теории ни один байт пропасть не должен, даже если unicode-последовательность содержит команду на ликвидацию Галактики. Но некоторые упр. и спецсимволы могут потребовать предв. удаления.

Есть мнение что они появляются еще во властных структурах при засыпании лицом на клавиатуре или сознательно добавляются безответственными SEO/веб-мастерами для борьбы с пауками/сливом и для роста посещаемости правовых систем. Некоторые 500-страничные общероссийские реестры публикуются в многостраничном TIFF с 150 dpi (едва читаемые, без текстового слоя для поиска). Но оказалось что в ЕС местами хуже, некоторых правовых документов вообще нет онлайн.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Ципихович Эндрю

Цитата: economist от 10 января 2024, 08:30И куда подевались вопросы к Basic в виде обрыва документов?
попутали - обрывки документов были у скрипта на Питоне и так как скорость обоих решений - скрипта на Бейсике и скрипта на Питоне примерно одинаковая смысла скрипт на Питоне дорабатывать нет, но я хотя-бы получил опыт кодинга на Питоне для либры, этот кодинг также как кодинг на Питоне для Блокнота++ они оба специфические...
к макросу на Бейсике вопросов нет 10 мин - 30 документов - более 10 000 страниц
советы про скачивание документов в разных форматах и на разных площадках мне не подходят - я скачиваю только хтм файлы и в одном месте К+, они мне нужны ещё и для других целей

mikekaganski

Цитата: Ципихович Эндрю от  9 января 2024, 10:09финальный код:

Хмм, а ведь Вы не переустанавливаете tRange, и в цикле переопределяете его содержимое. По логике, в Вашем конечном документе не должно быть ничего, кроме "Начато: ... Окончено ...", если в цикле нет в самом начале (и перед подвалом) 'tRange = text.End'.
С уважением,
Михаил Каганский

Ципихович Эндрю

Цитата: mikekaganski от 10 января 2024, 09:14а ведь Вы не переустанавливаете tRange
ну да видимо так и есть исправил - отпишусь о результатах