Python:.doc、.docxの2つのWordファイルの概要を読み、「Wordでイベントを発生させることができませんでした」エラー



Python Read Doc Docx Two Word File Briefs Andword Failed Raise Eventerror



PythonでWordファイルを読み取ることができるライブラリは、python-docxとpywin32です。

利点 不利益
python-docx クロスプラットフォーム .docx形式のみを処理でき、.doc形式は処理できません
pywin32 Windowsプラットフォームのみ .docと.docxの両方が処理できます

私はPython学習のための小さな学習サークルを作成し、誰もがPythonについて議論するためのプラットフォームを提供しています。ようこそみなさん Python学習グループ:960410445 ビデオ共有学習について一緒に話し合います。 Pythonは開発の将来の方向性であり、分析機能と世界を知る方法に挑戦しています。したがって、私たちは時代とともに前進し、変化を歓迎し、絶えず成長しています。 Pythonのコアテクノロジーを習得することが真の価値です。



pywin32

このライブラリは非常に強力で、単語を読むことができるだけでなく、pywin32 read .docの記事をオンラインで紹介することは、非常に使いにくいため、それほど多くはありません。

以下は、pywin32が.docを読み取るためのコード例ですが、テーブルの読み取りに問題があり、出力がすべて空であり、使用を目的としていないため理由が不明であるため、詳細な調査はありません。 。また、テーブルに垂直方向に結合されたセルがある場合、エラーが発生します。「テーブルに垂直方向に結合されたセルがあるため、このコレクションの個々の行にアクセスできません。」



from win32com.client import Dispatch Word = Dispatch('Word.Application') # Open the word application # word = DispatchEx('Word.Application') # Start an independent process word.Visible = 0 # background running, not showing word.DisplayAlerts = 0 # No warning path = r'E:abc	est.doc' doc = word.Documents.Open(FileName=path, Encoding='gbk') for para in doc.paragraphs: print(para.Range.Text) for t in doc.Tables: for row in t.Rows: for cell in row.Cells: print(cell.Range.Text) doc.Close() word.Quit 

しかし、pywin32のもう1つの機能は、.doc形式を.docx形式に保存して、python-docxで処理できるようにすることです。

def doc2docx(path): w = win32com.client.Dispatch('Word.Application') w.Visible = 0 w.DisplayAlerts = 0 doc = w.Documents.Open(path) newpath = os.path.splitext(path)[0] + '.docx' doc.SaveAs(newpath, 12, False, '', True, '', False, False, False, False) doc.Close() w.Quit() os.remove(path) return newpath 

python-docx

import docx fn = r'E:abc	est.docx' doc = docx.Document(fn) for paragraph in doc.paragraphs: print(paragraph.text) for table in doc.tables: for row in table.rows: for cell in row.cells: print(cell.text) 

垂直方向にマージされたセルの場合、python-docxの処理も非常に親密です。



Wordはイベントを発生させることができませんでした

.docファイルをクロールした後、私のクローラーは上記の方法でそれを.docx形式に変換します。すべて順調。仕事が終わったら電話を切ります。私は翌日それを見に来て、このエラーを報告しました:

doc2docxメソッドをエラーファイルとは別にデバッグしましたが、エラーは報告されませんでした。このエラーをオンラインで確認しましたが、何のメリットもありませんでした。

テストを繰り返した結果、ページが常に誤って報告され、バグが再現される可能性があることがわかりました。問題は、エラーがどこにあるかです。

エラーの実行に必要なコードだけが残るまで、コード行を削除します。

def get_winningbid_detail(url, name): r = requests.get(url) r.encoding = 'utf-8' html = r.text soup = BeautifulSoup(html, 'lxml') Ps = soup.find_all(text=re.compile('attachment')) if len(ps) > 0: os.makedirs(os.path.join(download_dir, name), exist_ok=True) for p in ps: a_tab = p.find_next_sibling('a') if a_tab is not None: link = homepage + a_tab['href'] localfilename = os.path.join(download_dir, name, a_tab.text) # print(localfilename) with open(localfilename, 'wb+') as sw: sw.write(requests.get(link).content) if localfilename.endswith('.doc'): doc2docx(localfilename) 

このコードを繰り返し読んでも、問題は見つかりませんでした。

announcement.docなど、一部のWebページの添付ファイル名は同じであるため、ダウンロードしたファイルを各Webページのタイトル(概要ページでクロールされた)のサブフォルダーに配置し、名前パラメーターをメソッドに渡しました。 nameパラメータが空の場合、エラーは報告されません。

実際、バグが存在することはすでにわかっていますが、私はそれを予期していなかったので、ファイル名が長すぎることを繰り返し投げ出すのに長い時間がかかりました。

Windowsでは、1つのファイル名の長さの制限は255であり、フルパスの長さ(E: abc test.docなど)は260に制限されており、漢字は2文字を占めます。

パスは文字列ターミネータ ' 0'で終わり、1文字を占めるため、フルパスの実際の制限は259です。