実現したいこと
wordのフッターを消すプログラムを作成しました。
動くのですが、なぜこれで動くのかがわかりません。
コードの解説をお願いしたいです。
前提
pythonで、wordのフッターを消すプログラムを実装しています。
python-docxで提供されているメソッドには目的にピンポイントに合うメソッドが無いようでしたので、インターネットでフッターを消すためのコードを調べました。
ソースコード上の、#↓このあたりの処理がわからない で書かれている箇所です。
これで確かに動くのですが、以下のことが理解できず困っています。
①paragraph._element 、paragraph._p とは何なのか
②paragraph._p = paragraph._element = None は何のために必要なのか
(この一行が無くても、フッターは消えます)
③なぜparagraph._p = paragraph._element = Noneだけではフッターが消えないのか。
paragraph._p = paragraph._element = Noneを実行することで、それぞれの要素の参照先アドレスが更新され、中身はnoneになることを確認しました。
であれば、このparagraph._p = paragraph._element = Noneだけ実装すればフッターは消えそうですが、このコードだけではフッターは消えません。
参照先アドレスは、print(id(paragraph._p))で、中身はprint(paragraph._p)でコンソールに出して調べました。
発生している問題・エラーメッセージ
ソースは動くが、仕組みが分からない。
該当のソースコード
python
1import os 2import docx 3from docx import Document 4import inspect 5 6#フッター削除対象フォルダ 7ROOT_PATH = 'XXXXXXXXXXXXXXXXXXXXXXXXXXX' 8 9def removeFooter(file_path): 10 11 document = docx.Document(file_path) 12 sections = document.sections 13 14 for section in sections: 15 sections_footer = section.footer 16 17 paragraphs = sections_footer.paragraphs 18 19 for paragraph in paragraphs: 20 21 #↓このあたりの処理がわからない 22 element = paragraph._element 23 element.getparent().remove(element) 24 paragraph._p = paragraph._element = None 25 #↑このあたりの処理がわからない 26 27 document.save(file_path) 28 29def process(path): 30 for pathname, dirnames, filenames in os.walk(path): 31 for filename in filenames: 32 if isDocx(filename): 33 removeFooter(os.path.join(pathname,filename)) 34 35def isDocx(filename): 36 return filename.endswith('.docx') 37 38def delete_paragraph(paragraph): 39 p = paragraph._element 40 p.getparent().remove(p) 41 paragraph._p = paragraph._element = None 42 43process(ROOT_PATH) 44 45### 試したこと 46各処理の前後で、参照しているアドレスとその中身を確認してみました。 47参照先アドレスは、print(id(paragraph._p))で、中身はprint(paragraph._p)でコンソールに出して調べました。 48 49------remove前------ 50------id------ 51element: 2143599308512 52paragraph._element:2143599308512 53paragraph._p: 2143599308512 54------中身------ 55element: <CT_P '<w:p>' at 0x1f31879aee0> 56paragraph._element:<CT_P '<w:p>' at 0x1f31879aee0> 57paragraph._p: <CT_P '<w:p>' at 0x1f31879aee0> 58 59------remove後------ 60------id------(remove前と変化なし) 61element: 2143599308512 62paragraph._element: 2143599308512 63paragraph._p: 2143599308512 64------中身------(remove前と変化なし) 65element: <CT_P '<w:p>' at 0x1f31879aee0> 66paragraph._element: <CT_P '<w:p>' at 0x1f31879aee0> 67paragraph._p: <CT_P '<w:p>' at 0x1f31879aee0> 68 69------paragraph._p = paragraph._element = None後------(アドレスと中身が変わる) 70------id------ 71element: 2143599308512 72paragraph._element: 140711526034632 73paragraph._p: 140711526034632 74------中身------ 75element: <CT_P '<w:p>' at 0x1f31879aee0> 76paragraph._element: None 77paragraph._p: None 78 79### 補足情報(FW/ツールのバージョンなど) 80 81なし

回答1件
あなたの回答
tips
プレビュー