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

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

ただいまの
回答率

90.33%

  • Python

    9289questions

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

  • Python 3.x

    7456questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 70

jack1222

score 6

前提・実現したいこと

パイソンのコードでどうしてもやり方がわからず困っています。
今テキストファイル(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 

試したこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jack1222

    2018/12/07 11:52

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

    キャンセル

  • can110

    2018/12/07 11:57 編集

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

    キャンセル

  • jack1222

    2018/12/07 12:04

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

    キャンセル

回答 1

checkベストアンサー

0

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

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

from pprint import pprint

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')

ret = []
fed,auth = {},{} # 現在読込中の章、著者

state = ''
for line in lst:

    if len(line) <= 0:
        continue

    if line.startswith('FEDERALIST'):    # 章の区切り

        # 取得済みを追加記録
        if len(auth) > 0:
            fed['authors'].append(auth)
        if len(fed) > 0:
            ret.append(fed)

        fed = {'name':line, 'text':[],'authors':[]}
        auth= {}
        state = 'GET_FED_TEXT'
        continue

    elif line.upper() == line:    # 著者の区切り は 全部大文字

        # 取得済みを追加記録
        if len(auth) > 0:
            fed['authors'].append(auth)

        auth = {'name':line,'text':[]}
        state = 'GET_AUTH_TEXT'
        continue

    if state == 'GET_FED_TEXT':    # 章のタイトル
        fed['text'].append(line)
    elif state == 'GET_AUTH_TEXT': # 章の内容
        auth['text'].append(line)

# 取得済みを追加記録
if len(auth) > 0:
    fed['authors'].append(auth)
if len(fed) > 0:
    ret.append(fed)

pprint( ret)
"""
[{'authors': [{'name': '  MADISON', 'text': ['    aa', '    bb']}],
  'name': 'FEDERALIST No.1',
  'text': ['    pen', '    apple']},
 {'authors': [{'name': '  JOHN', 'text': ['    cc']},
              {'name': '  PAUL', 'text': ['    dd']}],
  'name': 'FEDERALIST No.2',
  'text': ['    banana', '    orange', '    melon']},
 {'authors': [{'name': '  EMILY', 'text': ['    ee', '    ff']}],
  'name': 'FEDERALIST No.3',
  'text': ['    bass', '    guiter']}]
"""

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

for fed in ret:
    print(fed['name'])
    for line in fed['text']:
        print(line)
    print(fed['authors'][0]['name'])
"""
FEDERALIST No.1
    pen
    apple
  MADISON
FEDERALIST No.2
    banana
    orange
    melon
  JOHN
FEDERALIST No.3
    bass
    guiter
  EMILY
"""

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/07 12: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

    キャンセル

  • 2018/12/07 12:31

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

    キャンセル

同じタグがついた質問を見る

  • Python

    9289questions

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

  • Python 3.x

    7456questions

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