HTMLの複数行テキストボックスから受け取ったテキストは、そのままでは扱いにくいので、行ごとにリスト化して処理する方法を説明します。一行ずつ評価や編集することにより、コードも処理の記述が容易になります。
呼び出し側の記述
複数行のテキストボックスは<textarea・・・>で記述します。colsで1行の文字数を、rowsで行数を指定します。
<textarea id="copyTarget" name="text" cols="44" rows="10" wrap="off"></textarea>
cgiを呼び出す側のHTMLの全体の記述はこちらのページに記載しています。
cgi側の記述
複数行テキストボックス(textarea)の値の取得
getvalueメソッドを使って、cgi.FieldStorage()からテキストボックスの内容を受け取ります。
form = cgi.FieldStorage()
text = form.getvalue(‘text’, ”)
ここで変数textに代入された文字列は、まだリスト化されていません。
複数行テキストのリスト化
ひとかたまりの文字列を改行コードで区切って配列化することで、リストととして扱えるようになります。以下のように文字列変数に.split(“\n”)を付けることで、行ごとのリストを作成できます。ここでは、行ごとのリストを変数stringlistに代入しています。
stringlist = text.split(“\n”)
for文でリストの各要素の値を取得 方法1
直接要素を受け取る
for line in stringlist:
このように書くことで、forループの中でリスト(stringlist)の中の行ごとの要素が文字列型変数(line)に直接代入されます。
リストの内容で別のリストを作る
index=[] #配列の宣言
for line in stringlist:
index.append(line)
index=[]のように新たなリスト(index)の宣言を行い、forループの中で.append() すると、新たなリストに元リストの要素が追加されます。上記のコードは単なるコピーですが、下記の例では、append()の前に、line変数に対して置換の加工を行っています。
要素の追加の前に処理を挟む その1
行の先頭の文字を調べて特定の文字を置換する処理は以下のように書くことができます。
この例では、行の先頭5文字が”Hello”のとき、”Hello”を変数aisatsuの中身に置換します。
index=[]
aisatsu="Hello こんにちは"
for line in stringlist:
if line[0:5]=="Hello": #最初の5文字で判定
line=line.replace("Hello",aisatsu)
index.append(line)
.replace は置換された文字列を与える関数です。このように代入文にしないとlineの値は変化しないので注意して下さい。replace(“Hello”,aisatsu)のようにコンマの前が検索対象の文字で、コンマの後ろが置換する文字です。
forループの中で行番号を知りたいときはforループに入る前に初期化(i = 0)した変数にforループの中で毎回1を足す操作を行います。
for文でリストの各要素の値を取得 方法2
自動で行番号を知りたいとき
先ほどの例では行番号は自分で管理する必要がありましたが、
for i in range(len(index)):
と、書くと自動的に i に行番号(0~)が入ります。各行の内容(文字列)はindex[i]で取得できます。
要素の追加の前に処理を挟む その2
例として、行ごとに文字列の存在を判断し、文字を削除する処理を挟みます。
for i in range(len(index)): #range(len()) で0から最後までという意味
str = index[i]
if "Hello " in str and i > 0: #その文字が含まれているかを in で判定する
str = str[6:] #6文字目までを削除した結果を渡す
if not i == 2: #not == は != にしても同じ
array.append(str)
リストの内容をテキストボックスに出力
forループで文字列を取り出してprint()することで、リストの内容を表示(出力)することができます。
for line in array:
print(line)
最終的に加工してできあがった文字列リストをユーザーに提示するにはHTML文を作成する必要があります。
例として、複数行のテキストを受け取り、行ごとに内容を解析し、加工するcgiのコード全体をこちらのページに記載しています。
例では、出力する文字列をテキストボックスの中に表示しています。テキストボックスを表示するためのHTML文もcgiの中に記述します。