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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

1634閲覧

python3で特定の範囲の行を抽出する方法

jack1222

総合スコア16

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

1グッド

1クリップ

投稿2018/12/07 00:43

編集2018/12/07 03:03

前提・実現したいこと

パイソンのコードでどうしてもやり方がわからず困っています。
今テキストファイル(laungauge.txt)があります。その内容は以下のよう感じです。
本の章名, 章のタイトル、章の著者、章の内容が以下のような感じで並んでいます。
以下テキストファイル(laungauge.txt)の内容です。


FEDERALIST No.1 #本の章名

This is the pen. #章のタイトル この文と次の文は章のタイトルです。章のタイトルは、2行の場合もあるし、3行の場合もあります。行間は一行空いています。

This is an apple.

MADISON # 章の著者名

ahahahahabaergerhaeha #本の内容
ahahrharhhea

FEDERALIST No.2 #本の章名

This is the pen. #章のタイトル この文と次の文は章のタイトルです。章のタイトルは、2行の場合もあるし、3行の場合もあります。行間は一行空いています。

This is an apple.

This is an Banana

JOHN # 章の著者名

ahahahahabaergerhaeha #章の内容

ahahrharhhea

FEDERALIST No.3 #本の章名

This is the pen. #章のタイトル この文と次の文は章のタイトルです。章のタイトルは、2行の場合もあるし、3行の場合もあります。行間は一行空いています。

This is an apple.

HAMILITON # 章の著者名

ahahahahabaergerhaeha #章の内容
ahahrharhhea


このパターンでFEDERALIST No.84までつづいています。
このようなファイルで、本の章名から章の著者名までの情報を抜き出したいのですが、どのようにすればいいのかわからず大変困っています。FEDERALIST No.84まであるので本の章名から章の著者名までの情報が84個あることになるのですが、どなかどのようにすればいいか教えていただけませんでしょうか。
本の章名がそれぞれFEDERALIST で始まっていること、また章の著者名が,MADISON, JOHN, HAMILTONの3人しかいないので、その名前に当たると情報抜き取り終了のようにできないかと考えています。
大変ややこしいですがどうぞよろしくお願いいたします。

###理想とするアウトプット

FEDERALIST No.1

This is the pen.

This is an apple.

MADISON

FEDERALIST No.2

This is the pen.

This is an apple.

This is an Banana

JOHN

FEDERALIST No.3

This is the pen.

This is an apple.

HAMILITON

試したこと

すいません。
いろいろかんがえてみたのですが、どうやってすればいいのか全然わかりません。
手も足もでない状態です。

退会済みユーザー👍を押しています

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

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

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

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

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

can110

2018/12/07 02:20

「本の章名から章の著者名までの情報を抜き出したい」とは提示データだと「This is~」文のみ抽出したいということでよろしいですか?
jack1222

2018/12/07 02:46

書き込みありがとうございます。いいえ、違います。FEDERALIST No.1の場合だと、FEDERALIST No.1 #本の章名 から MADISON # 章の著者名までのFEDERALIST No.1とMADISON までを含んだものです。
jack1222

2018/12/07 02:52

自分が思うには、FEDERALISTの行から、以下の記述を残すようにして、MADISON, JOHN, HAMILTONの3人の名前のどれかに当たれば記述終了みたいな感じで、それをテキストファイル全体で行うような感じをイメージしているのですが。。。
can110

2018/12/07 03:04 編集

「本の章名~章のテキスト」まででしょうか? 提示入力データにおける理想の結果例を追記くださると明確になるかと思います。いずれにせよ、任意のデータを抽出、出力する例を回答として追記しました。
jack1222

2018/12/07 03:04

大変申し訳ございませんでした。理想の結果例を加えさせていただきました。もしよろしければ、この結果に沿って教えていただけませんでしょうか。大変申し訳ございません。
guest

回答1

0

ベストアンサー

  1. 章は「FEDERALIST~」ではじまる
  2. 章のタイトル、章の内容には全部大文字の行がない

という条件を満たすデータであれば、以下のような処理でデータを抜き出せます。

Python

1from pprint import pprint 2 3lst = """ 4FEDERALIST No.1 5 pen 6 apple 7 MADISON 8 aa 9 bb 10FEDERALIST No.2 11 banana 12 orange 13 melon 14 JOHN 15 cc 16 PAUL 17 dd 18FEDERALIST No.3 19 bass 20 guiter 21 EMILY 22 ee 23 ff 24""".split('\n') 25 26ret = [] 27fed,auth = {},{} # 現在読込中の章、著者 28 29state = '' 30for line in lst: 31 32 if len(line) <= 0: 33 continue 34 35 if line.startswith('FEDERALIST'): # 章の区切り 36 37 # 取得済みを追加記録 38 if len(auth) > 0: 39 fed['authors'].append(auth) 40 if len(fed) > 0: 41 ret.append(fed) 42 43 fed = {'name':line, 'text':[],'authors':[]} 44 auth= {} 45 state = 'GET_FED_TEXT' 46 continue 47 48 elif line.upper() == line: # 著者の区切り は 全部大文字 49 50 # 取得済みを追加記録 51 if len(auth) > 0: 52 fed['authors'].append(auth) 53 54 auth = {'name':line,'text':[]} 55 state = 'GET_AUTH_TEXT' 56 continue 57 58 if state == 'GET_FED_TEXT': # 章のタイトル 59 fed['text'].append(line) 60 elif state == 'GET_AUTH_TEXT': # 章の内容 61 auth['text'].append(line) 62 63# 取得済みを追加記録 64if len(auth) > 0: 65 fed['authors'].append(auth) 66if len(fed) > 0: 67 ret.append(fed) 68 69pprint( ret) 70""" 71[{'authors': [{'name': ' MADISON', 'text': [' aa', ' bb']}], 72 'name': 'FEDERALIST No.1', 73 'text': [' pen', ' apple']}, 74 {'authors': [{'name': ' JOHN', 'text': [' cc']}, 75 {'name': ' PAUL', 'text': [' dd']}], 76 'name': 'FEDERALIST No.2', 77 'text': [' banana', ' orange', ' melon']}, 78 {'authors': [{'name': ' EMILY', 'text': [' ee', ' ff']}], 79 'name': 'FEDERALIST No.3', 80 'text': [' bass', ' guiter']}] 81"""

あとは適宜必要なデータを抜き出して出力できます。
なお、間の空白行は解析に面倒なのでデータ抽出時に捨てています。
よって、出力時に補う必要はあります。下記例では補っていません。

Python

1for fed in ret: 2 print(fed['name']) 3 for line in fed['text']: 4 print(line) 5 print(fed['authors'][0]['name']) 6""" 7FEDERALIST No.1 8 pen 9 apple 10 MADISON 11FEDERALIST No.2 12 banana 13 orange 14 melon 15 JOHN 16FEDERALIST No.3 17 bass 18 guiter 19 EMILY 20"""

投稿2018/12/07 01:27

編集2018/12/07 03:12
can110

総合スコア38233

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

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

jack1222

2018/12/07 03:28

何度も何度も大変申し訳ございません。 lst = """ FEDERALIST No.1 pen apple MADISON aa bb FEDERALIST No.2 banana orange melon JOHN cc PAUL dd FEDERALIST No.3 bass guiter EMILY ee ff """.split('\n') 以上でファイルの内容を変数(lst)に代入して結果を得ていると思うのですが、それをこちらでは、 f = open('language.txt') data1 = f.read() f.close() とし、 コードの途中の部分をlstをdata1に変更してみたのですがうまくいきません。これは、なぜでしょうか。 本当に基本的なことをお伺いし大変申し訳ございません。 "for line in data1: if len(line) <= 0: continue
can110

2018/12/07 03:31

「うまくいきません」だけではアドバイスしようがないのですが… ファイルをリストに読み込む処理は、ごく基本的な事柄なのでご自身で実装ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問