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

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

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

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

HTML5

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

Python 3.x

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

Q&A

解決済

1回答

1242閲覧

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

BucharestNinja

総合スコア14

Django

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

HTML5

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

Python 3.x

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

0グッド

0クリップ

投稿2019/03/14 16:26

編集2019/03/16 02:21

前提・実現したいこと

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

該当のソースコード

python

1views.py 2 3from django.shortcuts import render 4import random 5import numpy 6from django.http.response import HttpResponse 7 8 9# Create your views here. 10class mulliganHand: 11 12 def post_list(request): 13 c={ 14 "messege":"sumple messege", 15 } 16 return render(request, 'mulligan/post_list.html', c) 17 18 def getDeckList(request): 19 20 d={ 21 "firstHand":request.POST["saveDeck"], 22 } 23 loop=1 24 deck=[] 25 data =d["firstHand"]#デッキのデータを読み込む 26 for cardList in data: 27 num,*card=cardList.split(" ",1)#カードの枚数とカードの名前を分ける 28 stripNum=int(num.rstrip()) 29 while loop<=stripNum: 30 deck.extend([*card]) #デッキリストのカードを先頭から一行ずつ読み込む 31 loop+=1 32 loop=1 33 34 a={"deck":deck[0]} 35 return render(request,"mulligan/getDeckList.html",a) 36 37 38

html

1post_list.html 2 3<!DOCTYPE html> 4 5<html lang="ja"> 6 <head> 7 <meta charset="utf-8"> 8 </head> 9 10 <body> 11 <h1>マリガン練習アプリ</h1> 12 <form method="post" action="getDeckList/"> 13 {% csrf_token %} 14 <label>デッキ</label> 15 <textarea name="saveDeck" rows="20" cols="80" wrap="hard"></textarea> 16 <input type="submit" value="保存"> 17 </form> 18 19</body> 20

試したこと

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

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

Python3.7.1
django2.1.7

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

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

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

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

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

ryu22e

2019/03/15 04:42

> djangoでユーザーがtextareaに入力した文字列を一行ずつ取得し、文の先頭の数字とそれ以外の文に分けたあとで、 文の先頭の数字の回数分だけlistにそれ以外の文を追加するという機能を実装しようとしたのですが、上手く行きませんでした。 質問文に「入力値」・「期待する結果」の例を挙げてほしいです。 以下のように解釈しましたが、合っているか分かりません。 【入力値】 3回 あああ いいい 【期待する結果】 以下の値のlistを取得できる。 ['あああ\nいいい', 'あああ\nいいい', 'あああ\nいいい']
BucharestNinja

2019/03/16 02:22

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

回答1

0

ベストアンサー

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

エラーメッセージ

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

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

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

text

1 210 a 320 b

text

110 a 2 320 b

text

110 a 220 b 3

text

1 10 a 220 b

text

110 a 220 b

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

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

追記 2019/03/16

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

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

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

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

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

patch

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

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

スクリプト:

python

1data = """3 Dive Down (XLN) 53 21 Essence Capture (RNA) 37 3""" 4 5loop = 1 6deck = [] 7for cardList in data.splitlines(): 8 num, *card = cardList.split(" ", 1) 9 stripNum = int(num.rstrip()) 10 while loop <= stripNum: 11 deck.extend([*card]) # デッキリストのカードを先頭から一行ずつ読み込む 12 loop += 1 13 loop = 1 14 15print(deck)

出力結果:

text

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

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

python

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

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

投稿2019/03/15 04:36

編集2019/03/16 03:25
gh640

総合スコア1407

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

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

BucharestNinja

2019/03/16 02:29

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

2019/03/16 03:26

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

2019/03/16 03:51

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

2019/03/16 04:04

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問