MAYA,Python [Python]区切り文字を指定して文字列を分割する方法-MAYA アーティストのスクリプト入門-

[Python]区切り文字を指定して文字列を分割する方法-MAYA アーティストのスクリプト入門-

maya_python_delimit strings_topimage

Pythonの文字列を扱う方法は多種多様にあります。

その中で今回は、区切り文字を指定して文字列を分割する方法を紹介します。

「指定した文字を境に前後で分割したい」「文字列の中にある特定の文字でバラバラにしたい」

など、文字列の中にある特定の文字「区切り文字」を指定して分割する方法です。

この記事で紹介する方法はとても簡単に扱えます。使用頻度もとても高いので是非しっかり覚えてみてください。

split() 区切り文字を指定して文字列を分割する

Pythonで区切り文字で文字列を分割するには

split(“区切り文字”,分割回数)

を使います。

区切り文字を指定しない

split()は区切り文字を省略して使うことが出来ます。

区切り文字を省略して使った場合は

  • 「” “」半角空白
  • 「”    “」「”\t”」タブ
  • 「”\n”」改行


が区切り文字として扱われます。

空白を区切り文字として分割した場合

str = "failure teaches success."
print(str.split())

結果:

空白で分割されました。分割された文字列はlistで返されます

[‘failure’, ‘teaches’, ‘success’]


タブを区切り文字として分割した場合

str = "practice    makes\tperfect."
print(str.split())


結果:

タブで分割されました。

[‘practice’, ‘makes’, ‘perfect.’]


改行文字を区切り文字として分割した場合

str = "It's\nnever\ntoo\nlate\nto\nlearn."
print(str.split())


結果:

改行文字で分割されました。

[“It’s”, ‘never’, ‘too’, ‘late’, ‘to’, ‘learn.’]

区切り文字を明示的に指定する

区切り文字を明示的に指定して分割してみましょう。

str = "Noxpainxnoxgain."
print(str.split("x"))


説明:

「”x”」を区切り文字として指定しました。


結果:

「”x”」で分割されました。

[‘No’, ‘pain’, ‘no’, ‘gain.’]

分割回数を指定する

上記の方法では区切り文字の箇所全てで分割されました。

split()は文字列の左側から分割する回数を指定する事が出来ます。

str = "Faithnwillnmovenmountains."
print(str.split("n",3))


説明:

「”n”」を区切り文字として指定、分割回数を「3」に設定しました。


結果:

「”n”」で3回分割されました。
「’mountains.’」の文字列にも「”n”」が2文字入っていますが、分割回数「3」を指定したので分割されませんでした。

[‘Faith’, ‘will’, ‘move’, ‘mountains.’]

rsplit() 区切り文字を指定して文字列を右側から分割する

split()で分割回数を指定して分割する場合は文字列の左側から分割しました。

逆に文字列の右側から分割したい場合は

rsplit(“区切り文字”,分割回数)

を使います。

右側から分割回数を指定する

str = "Tooofaroeastoisowest."
print(str.rsplit("o",4))

説明:

「”o”」を区切り文字として指定、右側からの分割回数を「4」に設定しました。


結果:

「”o”」で右側から4回分割されました。
「’Too’」の文字列にも「”o”」が2文字入っていますが、分割回数「4」を指定したので分割されませんでした。

[‘Too’, ‘far’, ‘east’, ‘is’, ‘west.’]

splitlines() 改行で文字列を分割する

長文の文字列の改行箇所で分割したい場合は

splitlines()

を使います。

str = "Make\nhaste\rslowly."
print(str.splitlines())


説明:

改行文字「”\n”」「”\r”」で文字列を区切ります。


結果:

「”\n”」「”\r”」で分割されました。

[‘Make’, ‘haste’, ‘slowly.’]

今度は改行文字を使わない場合

str = """That's life.
Travel broadens mind.
Look befor you leap.
The more one has,the more one wants."""

print(str.splitlines())


結果:

改行を区切りにして分割されました。

[“That’s life.”, ‘Travel broadens mind.’, ‘Look befor you leap.’, ‘The more one has,the more one wants.’]

MAYAで応用:設定ファイルを読み込んでポリキューブを生成する

文字列の分割を使って設定ファイルからポリキューブを生成するPythonスクリプトを書いてみます。

設定ファイル

設定ファイルとして以下の文字列を書いたテキストファイルを用意します。

primitive_name:polyCube_test
scalex:3
scaley:4
scalez:2

ファイル名 「polycube.txt」 で保存しました。

Pythonスクリプト

import maya.cmds as cmds
import codecs

scaleX = 1
scaleY = 1
scaleZ = 1
polyName = ""

txt_path = "C:/Users/xxxx/Documents/polycube.txt"

polycube_text = codecs.open(txt_path,"r","utf-8")
polycube_text_list = polycube_text.read().splitlines()

for i_polycube_text_list in polycube_text_list:
    
    if "scalex" == i_polycube_text_list.split(":")[0]:
        scaleX = int(i_polycube_text_list.split(":")[1])
    elif "scaley" == i_polycube_text_list.split(":")[0]:
        scaleY = int(i_polycube_text_list.split(":")[1])
    elif "scalez" == i_polycube_text_list.split(":")[0]:
        scaleZ = int(i_polycube_text_list.split(":")[1])
    else:
        polyName = i_polycube_text_list.split(":")[1]

cmds.polyCube( n = polyName)
cmds.setAttr(polyName +".scaleX" ,scaleX)
cmds.setAttr(polyName +".scaleY" ,scaleY)
cmds.setAttr(polyName +".scaleZ" ,scaleZ)
polycube_text.close()


説明:

txt_path = "C:/Users/xxxx/Documents/polycube.txt"

polycube_text = codecs.open(txt_path,"r","utf-8")

設定ファイルを文字コード”utf-8″で開きます

polycube_text_list = polycube_text.read().splitlines()

開いた設定ファイルを読み込んで「splitlines()」を使って改行で分割。リストにします。

リスト表示

[u’primitive_name:polyCube_test’, u’scalex:3′, u’scaley:4′, u’scalez:2′]
for i_polycube_text_list in polycube_text_list:
    
    if "scalex" == i_polycube_text_list.split(":")[0]:
        scaleX = int(i_polycube_text_list.split(":")[1])
    elif "scaley" == i_polycube_text_list.split(":")[0]:
        scaleY = int(i_polycube_text_list.split(":")[1])
    elif "scalez" == i_polycube_text_list.split(":")[0]:
        scaleZ = int(i_polycube_text_list.split(":")[1])
    else:
        polyName = i_polycube_text_list.split(":")[1]

リストをfor文を使って文字列ごとに処理します。各文字列を「split(“:”)」を使って2つに分割

リスト表示

[u’primitive_name’, u’polyCube_test’]
[u’scalex’, u’3′]
[u’scaley’, u’4′]
[u’scalez’, u’2′]


分割した前半が”scalex”ならば変数 scaleX に後半の値をintに変換して代入
分割した前半が”scaley”ならば変数 scaleY に後半の値をintに変換して代入
分割した前半が”scalez”ならば変数 scaleZ に後半の値をintに変換して代入
条件がそれ以外の場合は変数 polyName に後半の値を代入

cmds.polyCube( n = polyName)
cmds.setAttr(polyName +".scaleX" ,scaleX)
cmds.setAttr(polyName +".scaleY" ,scaleY)
cmds.setAttr(polyName +".scaleZ" ,scaleZ)

変数polyNameに代入した文字列の名前でポリキューブを生成
代入された変数の値を使ってポリキューブのスケール値を変更

polycube_text.close()

設定ファイルを閉じる


実行:

設定ファイルの値に沿ってポリキューブが生成されました。

設定ファイルの値に沿ってポリキューブが生成されました

まとめ

区切り文字を指定して文字列を分割する方法を紹介しました。


区切り文字で文字列を分割するには
split(“区切り文字”,分割回数)

文字列の右側から分割したい場合は
rsplit(“区切り文字”,分割回数)

文字列の改行箇所で分割したい場合は
splitlines()

分割された文字列はlistで返されます。

文字列の分割はあらゆる場面で使われます。しっかり覚える事をオススメします。

おすすめの関連記事:


コチラの記事も読まれています
あわせてよく読まれている記事