Nano Hash - криптовалюты, майнинг, программирование

Проблемы с доступом к MS Word 2010 с помощью Python

Я использую Python с Eclipse. Мне нужно получить доступ к файлу MS Word с помощью Python. Я видел несколько примеров, и я уже установил pywin32. Я попробовал некоторые из примеров, но я получаю некоторые ошибки.

import win32com.client as win32

word = win32.Dispatch("Word.Application")
word.Visible = 0
word.Documents.Open("myfile.docx")
doc = word.ActiveDocument
print doc.Content.Text
word.Quit()

Это ошибка, которую я получаю. Было бы здорово, если бы кто-нибудь мог сказать мне, что я сделал неправильно здесь.

Traceback (most recent call last):
  File "C:\Users\dino\Desktop\Python27\Test\src\AccessWordDoc.py", line 10, in <module>
    word = win32.Dispatch("Word.Application")
  File "C:\Python27\lib\site-packages\win32com\client\__init__.py", line 95, in Dispatch
    dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx)
  File "C:\Python27\lib\site-packages\win32com\client\dynamic.py", line 114, in _GetGoodDispatchAndUserName
    return (_GetGoodDispatch(IDispatch, clsctx), userName)
  File "C:\Python27\lib\site-packages\win32com\client\dynamic.py", line 91, in _GetGoodDispatch
    IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)
pywintypes.com_error: (-2147221005, 'Invalid class string', None, None)

Есть ли другой способ получить доступ к файлу MS Word и извлечь данные из него, не проходя через все это?

14.08.2013

  • Рассмотрим: github.com/mikemaccana/python-docx 14.08.2013
  • @Torxed - будет ли это работать для версии MS Word 2010. Я более чем готов рассмотреть любой вариант на данный момент. 14.08.2013
  • Так и будет, если документ будет сохранен в формате *.docx, а не в старом формате *.doc. Проверьте мой ответ ниже и проверьте ключ-значение реестра для Word, и вы можете подключиться к Word, если это необходимо. 14.08.2013

Ответы:


1

Win32 API для вызова системных API великолепен и все такое, но это рутинная работа. Если вы открыты для этой идеи и знаете, что вы будете получать доступ к более новому формату документа через Windows (на основе XML), то есть .docx я бы предложил использовать собственный модуль, такой как python-docx.

Нет причин использовать модуль pyWin32, если вы не собираетесь выполнять какие-то очень специфические задачи.

Существуют также альтернативы Excel, такие как openpyxl.

Что касается вашей первоначальной проблемы, я предполагаю, что Word, против которого вы подключаетесь, на самом деле не Microsft Word 2013, а скорее неизвестное или отсутствующее приложение.

Цитата Ссылка (это описывает вашу проблему и подтверждает мое предположение что Word.Application на самом деле не приложение)

Вы пытаетесь использовать несуществующий ProgID. «ProgID» на самом деле просто сопоставление с его CLSID. Похоже, ваш объект не регистрирует себя правильно.

Посмотрите в реестре - все COM-объекты имеют свое имя непосредственно в HKEY_CLASSES_ROOT. Под этим именем вы найдете CLSID. Этот CLSID будет иметь ключ в разделе HKEY_CLASSES_ROOT\CLSID. Просмотрите реестр, чтобы убедиться, что имена, которые вы пробовали, не существуют как COM-объекты.

В противном случае попробуйте использовать CLSID объекта напрямую вместо ProgID — просто передайте строку IID непосредственно в Dispatch().

Я проверил свой реестр под HKEY_CLASSES_ROOT\CLSID\ и искал Word, стоящий на этом ключе (папке). Я получил:

Ключ: {00020-0000-0000-0000-00000-0000} название: Microsoft Word Document
с подпапкой ProgID со значением: Word.Document.8
Что позволит мне сделать:

import win32com.client as win32

word = win32.Dispatch("Word.Document.8")
word.Visible = 0
word.Documents.Open("myfile.docx")
doc = word.ActiveDocument
print doc.Content.Text
word.Quit()

Теперь это более старая версия Word, так как у меня нет Word 2013 или даже чего-то необычного, как 2010 :) Или я мог бы просто ввести КЛЮЧ, который будет 00020-000.... (я думаю).

Аккуратный ленивый обходной путь видеоруководство здесь:

14.08.2013
  • Я пытаюсь открыть файл Word в python, чтобы извлечь некоторые данные. Я был бы не против, если бы я мог преобразовать файл .docx во что-то, чем может манипулировать python, если я могу получить дату из файла. 14.08.2013
  • Python может манипулировать docx с тем модулем, который я связал в самом начале. 14.08.2013
  • @Cryssie Кстати, если вы хотите открыть и преобразовать документ (вопреки логике или программированию ...), вы можете просто преобразовать его в обычный текстовый документ (* .txt)? 14.08.2013
  • Я считаю, что ваш метод должен работать, но, к сожалению, я использую MS Office Starter 2010, и мне не удалось найти правильное значение реестра для прохождения. 14.08.2013
  • К сожалению, попробуйте использовать модуль docx для получения ваших данных :) Удачи вам в ваших начинаниях! 14.08.2013

  • 2

    Код ниже работал для меня, это просто изменение «Word.Application» на «Word.Application.8»:

    import win32com.client as win32
    
    word = win32.Dispatch("Word.Application.8")
    word.Visible = 0
    word.Documents.Open("myfile.docx")
    doc = word.ActiveDocument
    print doc.Content.Text
    word.Quit()
    

    Я пришел к этому решению после предложения @Torxed изучить реестр. Когда я попробовал Word.Document.8, набор доступных методов не включал .Visible, .Quit и .Open, поэтому решение @Torxed у меня не сработало. (Теперь ясно, что объекты Application и Word предназначены для разных целей.) Вместо этого я также нашел Word.Application, Word.Application.8 и Word.Application.14 в моем реестре и только что попробовал Word.Application. 8, и это сработало, как и ожидалось.

    10.12.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..