質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Word

Microsoft WordはMicrosoftが開発した業務用の文書生成用のソフトウェアです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

681閲覧

Python Diffで変遷表作成の段落ズレ

tatsu757

総合スコア12

Word

Microsoft WordはMicrosoftが開発した業務用の文書生成用のソフトウェアです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/02/18 02:45

編集2021/02/18 02:47

Python difflibを使って2つのWordファイルの変更箇所を表にするプログラムを作成したいと考えています。

以前の質問でかなりの改良が実現しましたが、まだまだ問題点が残っているので、一部でも構いませんので解決方法をお持ちの方はご教示いただけますと幸いです。

【問題点】
・ルビを振った文字はDiffで差分をとる際にテキストとして認識されないので、変更対比表に出力されない。
・連続する複数の文を削除した箇所に新しい文書を追加すると、変更対比表の左右にズレが生じる。

【変更前のWord】青マーカーは削除箇所イメージ説明
【変更後のWord】黄色マーカーは追加箇所。緑マーカーは修正箇所。イメージ説明
【プログラムで作成した変更対比表】
-何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している
-吾輩はここで始めて人間というものを見た
上記の2文を削除した箇所に「2文削除した」と追加した。
削除した文書は完全に削除したので、変更対比表の右側には「-」と記載したい。
しかし、現状の条件分岐では「2文削除した」という文言は「何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している」という文を修正したものとみなされてしまう。
そのため、それ以降の変更対比表の段がずれてしまう。

イメージ説明

【理想の変更対比表】
イメージ説明
【Diffリスト】
イメージ説明

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文削除した。しかもあとで聞くとそれは書生という人間中で一番恐ろしい種族だそうだ。この書生というのは時々我々を捕(つかま)えて煮(に)て食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。ただ彼の掌(てのひら)に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始(みはじめ)であろう。この時妙なものだと思った感じが今でも残っている。第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶(やかん)だ。その後(ご)猫にもだいぶ逢(あ)ったがこんな片輪(かたわ)には一度も出会(でく)わした事がない。のみならず顔の真中があまりに突起している。そうしてその穴の中から時々ぷうぷうと煙(けむり)を吹く。どうも咽(む)せぽくて実に弱った。これが人間の飲む煙草(たばこ)というものである事はようやくこの頃知った。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問