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

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

ただいまの
回答率

90.50%

  • Python 3.x

    8930questions

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

  • HTML5

    4797questions

    HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

  • Django

    1458questions

    DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

djangoでtextareaに入力した文を一行ごとに取得してsplitで文を分割したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 65

前提・実現したいこと

djangoでユーザーがtextareaに入力した文字列を一行ずつ取得し、文の先頭の数字とそれ以外の文に分けたあとで、
文の先頭の数字の回数分だけlistにそれ以外の文を追加するという機能を実装しようとしたのですが、上手く行きませんでした。

入力値
3 Dive Down (XLN) 53
1 Essence Capture (RNA) 37

期待する結果
以下の値のlistを取得できる。
["Dive Down (XLN) 53","Dive Down (XLN) 53","Dive Down (XLN) 53","Essence Capture (RNA) 37"]

発生している問題・エラーメッセージ

invalid literal for int() with base 10: ''

問題が発生した箇所
stripNum=int(num.rstrip())

該当のソースコード

views.py

from django.shortcuts import render
import random
import numpy
from django.http.response import HttpResponse


# Create your views here.
class mulliganHand:

 def post_list(request):
     c={
        "messege":"sumple messege",
        }
     return render(request, 'mulligan/post_list.html', c)

 def getDeckList(request):

      d={
        "firstHand":request.POST["saveDeck"],
        }
      loop=1
      deck=[]
      data =d["firstHand"]#デッキのデータを読み込む
      for cardList in data:
        num,*card=cardList.split(" ",1)#カードの枚数とカードの名前を分ける
        stripNum=int(num.rstrip())
        while loop<=stripNum:
             deck.extend([*card]) #デッキリストのカードを先頭から一行ずつ読み込む
             loop+=1
        loop=1

      a={"deck":deck[0]}
      return render(request,"mulligan/getDeckList.html",a)
post_list.html

<!DOCTYPE html>

<html lang="ja">
 <head>
   <meta charset="utf-8">
 </head>

 <body>
   <h1>マリガン練習アプリ</h1>
   <form method="post" action="getDeckList/">
   {% csrf_token %}
    <label>デッキ</label>
    <textarea name="saveDeck" rows="20" cols="80" wrap="hard"></textarea>
    <input type="submit" value="保存">
  </form>

</body>

試したこと

ユーザーがtextareaに入力した内容をそのまま表示することには成功しました。

補足情報(FW/ツールのバージョンなど)

Python3.7.1
django2.1.7

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • ryu22e

    2019/03/15 13:42

    > djangoでユーザーがtextareaに入力した文字列を一行ずつ取得し、文の先頭の数字とそれ以外の文に分けたあとで、
    文の先頭の数字の回数分だけlistにそれ以外の文を追加するという機能を実装しようとしたのですが、上手く行きませんでした。

    質問文に「入力値」・「期待する結果」の例を挙げてほしいです。
    以下のように解釈しましたが、合っているか分かりません。

    【入力値】
    3回
    あああ
    いいい

    【期待する結果】
    以下の値のlistを取得できる。
    ['あああ\nいいい', 'あああ\nいいい', 'あああ\nいいい']

    キャンセル

  • BucharestNinja

    2019/03/16 11:22

    言葉足らずで申し訳ありません。
    質問文を修正いたしました。

    キャンセル

回答 1

checkベストアンサー

+1

「例外」「例外処理」というのはおわかりになりますか?想定外のデータが来たときのために、対象行のところで例外処理( try 〜 except )を行う必要があるものと思います。

エラーメッセージ

invalid literal for int() with base 10: ''

の意味は「 int() に渡された値は整数に変換できませんでした」です。

ご提示のコードですとおそらく(動作確認していないので「おそらく」)、例えば次のようなパターンが textarea に入力されたときにエラーが出てしまうと思います。

10 a
20 b
10 a

20 b
10 a
20 b
 10 a
20 b
10 a
20 b

このようなパターン想定してコードを書く必要があるのではないでしょうか。

質問者さんがどのぐらいの背景知識をお持ちなのかわからないので、「このぐらいかな」という仮定を措いて回答してみました。いかがでしょうか。

追記 2019/03/16

コメントお戻しいただきありがとうございます。そうですか。

質問文に追記した入力をした際にこちらのエラーが返ってくるということは、変数numの中に値が格納されていないということなのでしょうか。

そうですね、 num に空文字列( '' )が格納されている、というではないかと思います。

質問文に追記いただいた入力値でもエラーが出てしまうということでしたら、 data のループの cardList が想定外の形になっているのかもしれませんね。行単位での切り出しを期待されているかと思うのですが、 1 文字ずつの切り出しになっているののかもしれません。

例えば、次のような感じで、各ループの先頭で cardList の中身を出力して確認されてみてはいかがでしょう。

for cardList in data:
+     print('cardList: {!r}'.format(cardList))
    num,*card=cardList.split(" ",1)#カードの枚数とカードの名前を分ける

かんたんな検証のために、私の環境で次のスクリプトを書いて実行してみました。望ましい結果が出力されるようです。

スクリプト:

data = """3 Dive Down (XLN) 53
1 Essence Capture (RNA) 37
"""

loop = 1
deck = []
for cardList in data.splitlines():
    num, *card = cardList.split(" ", 1)
    stripNum = int(num.rstrip())
    while loop <= stripNum:
        deck.extend([*card])  # デッキリストのカードを先頭から一行ずつ読み込む
        loop += 1
    loop = 1

print(deck)

出力結果:

['Dive Down (XLN) 53', 'Dive Down (XLN) 53', 'Dive Down (XLN) 53', 'Essence Capture (RNA) 37']

これを、次のような形で、ループの data.splitlines() のところを単に data としてしまうと、ダメなようです。

for cardList in data:
    num, *card = cardList.split(" ", 1)

print() を入れて splitlines() のあるパターンと無いパターンでお試しになってみてください :D

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/16 11:29

    ご丁寧な回答ありがとうございます。
    例外処理については理解していますが、ひとまず特定の入力をした際に期待する結果が返ってくるかを確かめようとしていたので、処理を書くのを後回しにしていました。
    invalid literal for int() with base 10: ''
    質問文に追記した入力をした際にこちらのエラーが返ってくるということは、変数numの中に値が格納されていないということなのでしょうか。
    もしよろしければご教示の程よろしくお願いいたします。

    キャンセル

  • 2019/03/16 12:26

    コメントお戻しいただきありがとうございます。

    いただいたコメントへの返信を追記として回答欄に追加させていただきました。ご覧になってお試しになってみてください。

    キャンセル

  • 2019/03/16 12:51

    splitlines()を追加したところ期待した内容が出力されました。
    自力で解決出来ず悩んでいたため、非常に助かりました。
    ご回答頂きありがとうございました。

    キャンセル

  • 2019/03/16 13:04

    そうなのですね、ご解決されたとのことでよかったです!

    キャンセル

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

  • Python 3.x

    8930questions

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

  • HTML5

    4797questions

    HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

  • Django

    1458questions

    DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。