Python difflibを使って2つのWordファイルの変更箇所を表にするプログラムを作成したいと考えています。
以前の質問でかなりの改良が実現しましたが、まだまだ問題点が残っているので、一部でも構いませんので解決方法をお持ちの方はご教示いただけますと幸いです。
【問題点】
・ルビを振った文字はDiffで差分をとる際にテキストとして認識されないので、変更対比表に出力されない。
・連続する複数の文を削除した箇所に新しい文書を追加すると、変更対比表の左右にズレが生じる。
【変更前のWord】青マーカーは削除箇所
【変更後のWord】黄色マーカーは追加箇所。緑マーカーは修正箇所。
【プログラムで作成した変更対比表】
-何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している
-吾輩はここで始めて人間というものを見た
上記の2文を削除した箇所に「2文削除した」と追加した。
削除した文書は完全に削除したので、変更対比表の右側には「-」と記載したい。
しかし、現状の条件分岐では「2文削除した」という文言は「何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している」という文を修正したものとみなされてしまう。
そのため、それ以降の変更対比表の段がずれてしまう。
python
1import docx 2import difflib 3from docx.shared import Inches 4from docx import Document 5 6#注意点 7#ハイパーリンクは認識されないので、一括解除してから実行すること 8 9#問題点 10#ルビを振った文字は認識されない 11#'。'で区切られている文書を認識するようにしている 12#図の変更は認識しない 13#複数文削除したところに文書をいくつか追加すると、1つ目の追加文書は変更とみなされ、 14#2つ目の追加文書から追加とみなされるので、段の調整が必要 15 16 17def make_before_after(difflist): 18 before_list = ['変更前'] 19 after_list = ['変更後'] 20 m_buf = [] 21 for x in difflist: 22 if (x[:3] == '+++') or (x[:3] == '---') or (x[:2] == '@@'): 23 continue 24 if x[:1] == '-': 25 m_buf.append(x[1:]) #先頭に-がついていれば、-以降の文章をリストに追加 26 elif x[:1] == '+': 27 if m_buf != []:#m_buf≠空ならば 28 before_list.append(m_buf.pop(0)) #pop(0)でm_bufの先頭の要素を取得して削除(抜き取る)&変更前リストに追加 29 if x[1:] == '':#+以降に文字がない場合(改行を追加しただけの時) 30 continue#無視 31 else: 32 after_list.append(x[1:])#+以降に文字があれば変更後リストに追加 33 else: #m_bufの中身(変更前の文書)がない場合 34 before_list.append('-')#変更前リストに空白を示す-を追加 35 after_list.append(x[1:])#変更後リストには追加した文章を反映 36 else: 37 while m_buf != []: 38 before_list.append(m_buf.pop(0)) 39 after_list.append('-') 40 else: 41 while m_buf != []: 42 before_list.append(m_buf.pop(0)) 43 after_list.append('-') 44 return before_list, after_list 45 46 47text1 = [] 48text2 = [] 49doc_ord = docx.Document('吾輩は猫である_Ver1.docx') 50#num = 0 51for para1 in doc_ord.paragraphs: 52 #num = num + 1 53 text1.extend(para1.text.split('。')) 54 #print(text1) 55 56doc_new = docx.Document('吾輩は猫である_Ver2.docx') 57#num = 0 58for para2 in doc_new.paragraphs: 59 #num = num + 1 60 text2.extend(para2.text.split('。')) 61 #print(text2) 62 63g = difflib.unified_diff (text1, text2) 64#gの中身はジェネレーター 65 66#テキストファイルとして保存 67#with open('変更点.txt', 'w') as f: 68 #f.writelines('\n'.join(g)) 69 #'\n'.join(g)で改行させながら書き込み 70 71d = list(g) 72l = [s for s in d if s != '+']#改行を加えただけの変更等、不要な'+'をリストから削除 73before_list, after_list = make_before_after(l) 74 75 76# ドキュメントのファイル名 77docx_file = '変更対比表.docx' 78# ドキュメント生成 79document = Document() 80# 表の追加 81table1 = document.add_table(rows=len(before_list), cols=2) 82for cell, text in zip(table1.columns[0].cells, before_list): #zip関数でセルとリストを対応させる 83 cell.text = text #cell=i番目のセル、text=before_list[i] 84 85for cell, text in zip(table1.columns[1].cells, after_list): 86 cell.text = text 87 88 89document.save(docx_file) 90
【サンプル文書】
<変更前>
吾輩は猫である
• 夏目漱石
『吾輩は猫である』(わがはいはねこである)は、夏目漱石の長編小説であり、処女小説である。1905年(明治38年)1月、『ホトトギス』に発表され、好評を博したため、翌1906年(明治39年)8月まで継続した。上、1906年10月刊、中、1906年11月刊、下、1907年5月刊。
吾輩(わがはい)は猫である。名前はまだ無い。
どこで生れたかとんと見当(けんとう)がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪(どうあく)な種族であったそうだ。この書生というのは時々我々を捕(つかま)えて煮(に)て食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。ただ彼の掌(てのひら)に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始(みはじめ)であろう。この時妙なものだと思った感じが今でも残っている。第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶(やかん)だ。その後(ご)猫にもだいぶ逢(あ)ったがこんな片輪(かたわ)には一度も出会(でく)わした事がない。のみならず顔の真中があまりに突起している。そうしてその穴の中から時々ぷうぷうと煙(けむり)を吹く。どうも咽(む)せぽくて実に弱った。これが人間の飲む煙草(たばこ)というものである事はようやくこの頃知った。
<変更後>
吾輩は犬である
• 田中 太郎
『吾輩は猫である』(わがはいはねこである)は、夏目漱石の長編小説であり、処女小説である。1905年(明治38年)1月、『ホトトギス』に発表され、好評を博したため、翌1906年(明治39年)8月まで継続した。上、1906年10月刊、中、1906年11月刊、下、1907年5月刊。『吾輩は犬である』はPythonによる変更対比表の作成のデモンストレーション用に適当に改変した文章である。
吾輩(わがはい)は猫である。名前はまだ無い。
どこで生れたかとんと見当(けんとう)がつかぬ。2文削除した。しかもあとで聞くとそれは書生という人間中で一番恐ろしい種族だそうだ。この書生というのは時々我々を捕(つかま)えて煮(に)て食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。ただ彼の掌(てのひら)に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始(みはじめ)であろう。この時妙なものだと思った感じが今でも残っている。第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶(やかん)だ。その後(ご)猫にもだいぶ逢(あ)ったがこんな片輪(かたわ)には一度も出会(でく)わした事がない。のみならず顔の真中があまりに突起している。そうしてその穴の中から時々ぷうぷうと煙(けむり)を吹く。どうも咽(む)せぽくて実に弱った。これが人間の飲む煙草(たばこ)というものである事はようやくこの頃知った。
あなたの回答
tips
プレビュー