🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

Q&A

解決済

1回答

450閲覧

テキストファイルに含まれる文字列をもう一つのファイル内で検索したい

mojimojikun

総合スコア1

Python

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

0グッド

0クリップ

投稿2021/01/09 11:52

編集2021/01/09 11:54

#前提・実現したいこと
以下の二つのテキストファイルを入力として、DataA.txt内の文字列を一行ずつ、DataB.txt内で検索して、<doc title=" ">の文に一致した場合は、その行から<\doc>までをOutput.txtに出力するプログラムを作りたいのですが、初心者なので手も足も出ないです。皆様の知識をお借りしようと投稿しました。


#データ
-DataA.txt- 
田中太郎
山田花子


-DataB.txt-
<doc title="田中太郎">
田中太郎
<\doc>

<doc title="アップル"> アップル <\doc> <doc title="山田花子"> 山田花子 <\doc> <doc title="パイソン"> パイソン <\doc>

-理想のOutput.txt-
<doc title="田中太郎">
田中太郎
<\doc>

<doc title="山田花子"> 山田花子 <\doc>

#途中経過
-program.py-
import re
with open('DataA.txt', encoding="utf-8_sig") as oldfile, open('DataB.txt', encoding="utf-8_sig") as oldfile2, open('Output.txt', 'w', encoding="utf-8_sig") as newfile:

for title in oldfile: for line in oldfile2: if '<doc' in line and title in line:

            newfile.write(line+'\n')


プログラムは自分なりに途中まで書いたのですが、<doc title~の文だけでも抜き出そうとしたのですが、なぜか抜き出せません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

with open("DataA.txt", encoding="utf-8") as fa: a_lines = fa.readlines() with open("DataB.txt", encoding="utf-8") as fb: b_lines = fb.readlines() out_list = [] find = False for name in a_lines: for b_line in b_lines: if name.strip() in b_line: find = True if find: out_list.append(b_line) if "<\doc>" in b_line: find = False with open("Output.txt", mode="w", encoding="utf-8") as f: f.write("".join(out_list))

投稿2021/01/09 12:25

umau

総合スコア831

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

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

mojimojikun

2021/01/09 13:26 編集

ご回答ありがとうございます! 大きいデータで動かしたのですが Traceback (most recent call last): File "***.py", line 21, in <module> f.write("".join(out_list)) MemoryError となってしまいました。動かす際、DataAは300行の5KB、DataBは100万行の47MBです。PCの問題な気もしますが何か良い手段があればご教授願いたいです。。。
umau

2021/01/09 13:39

わざわざ自分でjoinする必要なかったですね。。 ``` with open("Output.txt", mode="w", encoding="utf-8") as f: f.writelines(out_list) ``` か、 ``` with open("Output.txt", mode="w", encoding="utf-8") as f: for line in out_list: f.write(line) ``` だとどうでしょうか?
mojimojikun

2021/01/09 15:07 編集

実行はできましたが出力が13GBと入力データよりも大きいデータとなっていました。。。
umau

2021/01/09 15:19

ここに例示されてるDataB.txtの内容のパターンに合わないデータが実際は含まれているなら、このプログラムそのままではうまくいかないと思います。 データサイズが増えてしまったという事は、おそらく閉じタグがの判定が当らず、DataAの人名が当たったところから最終行までを全部書き出してしまっていて、それをDataAの人の数だけ繰り返してしまっているんだと思われます。 初めから気になってますが、<\doc>は</doc>の間違いではないですか?
mojimojikun

2021/01/09 16:02

</doc>でした、、、本当にすいません。。。 うまく実行できました、丁寧で迅速に教えていただき、誠に感謝します。本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問