[Python] 読み込んだcsvファイルの列を入れ替えて表示する方法

Python
この記事は約7分で読めます。
寝ながら情報を集める女子
寝ながら情報を集める女子

Pythonでcsvファイルの任意の文字を含む行を出力する・しないというやり方は下の記事で分かったけど、列方向の操作は出来ないのかしら?

誰でも真面目に答えるモグラ
誰でも真面目に答えるモグラ

もちろん可能です。こういった事が出来るようになると、自分が持っている作業をドンドン自動化したくなってきます。

本記事に記載のPythonスクリプト動作確認環境

OS : Windows10(64bit版)
Python version : 3.7.3

先日の記事ではテキスト(csv)ファイルを読み込んで、行を出力する、しないの操作を行いました。今日の記事では列方向を色々と加工してみます。

ベースとする入力ファイルとソースコードはいつものアレです。

ベースとなるテキストファイルとPythonソースコードおよび実行結果(いつものアレ)
入力テキスト(csv)ファイル
ベースとなるPythonソースコード
f = open(r"C:\Python_source\01_TextFileRead\SampleTextSJIS.csv",encoding="shift_jis")
for line in f:
    print (line,end="")
実行結果(標準出力)

出席番号,名前,点数
1,たろう,96
2,じろう,68
3,さぶろう,31

スポンサーリンク

Pythonの文字列メソッドでとても重宝するsplit()

split()メソッドの使い方は
 リスト型 = 文字列オブジェクト.split(“区切りたい文字”)  
となります。

引数の “区切りたい文字” を省略した場合は、スペース1つ以上となります。split(” “)と同じ結果とはなりません。 split(” “) の場合は、スペースの数だけブツ切りにされます。。

では実際に入力ファイルの2行目で、Pythonをインタラクティブモードで起動して試してみましょう。コード中の “>>>” はプロンプトと呼ばれる、人間へのコマンド入力を促すものなので、入力する必要はありません。

>>> line = "1,たろう,96" # ファイル2行目をlineへ代入。この時、lineは文字列型の変数となる。 
>>> out = line.split(",") # split()関数を引数 "," でline中の文字列をその名の通りぶった切る。
>>> out # ぶった切った結果はoutへ代入されたので、中身を見てみると・・・
['1', 'たろう', '96'] # listっぽいですね。
>>> type(out) # 組み込みのtype()関数を使って一応確認してると。。 
<class 'list'> # うん。やっぱlist型。
>>> len(out) #  要素数を見てみると。。
3  # 3個ですね。 
>>> type(out[1]) # 要素の型を見てみると。。
<class 'str'> # str ・・・stringで文字列型ね。

コーディングに慣れないうちは、インタラクティブモードで上記のように動作を確認しながら実装を進めていくのが良いでしょう。ググるよりPythonに聞いた方が早い場合も多々あります。

例えばlist型変数のoutを、文字列を操作するsplit()メソッドで操作をしようとすると、

>>> out.split(",")
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    out.split(",")
AttributeError: 'list' object has no attribute 'split' # list型は'split' attribute を持っていない。

とこんな感じで、エラー内容をベラベラと詳細に教えてくれます。
上記のエラーは、listオブジェクトoutを文字列型のsplit()メソッドで操作しようとしたので、 listオブジェクトには split() 属性がないと怒られている事が理解出来ます。

Pythonでcsvファイルの列を入れ替えて表示する

すでに実装イメージが沸いた人が多いと思います。ここでは2通りのやり方を紹介します。

Pythonで文字列の連結を行う+演算子を用いる

>>> edit_line = out[2]+","+out[1]+","+out[0]   # 文字列を + を用いて連結。list要素の間には"," を入れる。
>>> edit_line   # 中を見てみると。。
'96,たろう,1'   # いいね! 

といった感じで入れ替える事が可能です。
例で示した通り、文字列は+演算子で繋げる事が出来ます。

Pythonの書式化演算子 % を用いる

または書式化演算子%を使って、以下のようにする事も出来ます。

 文字列 = ”書式文字列(%d,%s等を含む文字列)” % (値1, 値2, 値3・・・)

実際にはこんな感じ。

>>> edit_line = "%s,%s,%s" % (out[2],out[1],out[0])
>>> edit_line
'96,たろう,1'

実際のコーディングでは、書式化で得られた文字列をprint()関数やファイルオブジェクトのwrite()メソッドの引数として与えるという感じです。

書式には沢山ありますが、実際に良く使うのは %s(文字列), %d(10進数の整数), %f(10進数の不動小数点)位かなと思います。あと私は仕事柄、16進数もよく使います。

また%と英文字の間に後に数字や符号,ピリオドを入れる事で、表示する桁数や表示する時に文字を詰める方向を操作したりする事も可能となります。

>>> print ("%.1f" % 12.35)
12.3

この例では、# “.1” を%fの間に挟むことで、小数点以下の数字は1桁までと指定しています。書式化については、一度記事にまとめたいと思います。

まとめ

Pythonインタラクティブモードで確認してきた事と、ベースソースを参考に作成したスクリプトを最後に記載します。

NGの例
Pytthonソース
f = open(r"C:\Python_source\01_TextFileRead\SampleTextSJIS.csv",encoding="shift_jis")
for line in f:
    line_list = line.split(",")
    line_edit = "%s,%s,%s" % (line_list[2],line_list[1],line_list[0])
    print(line_edit)
実行結果

点数
,名前,出席番号
96
,たろう,1
68
,じろう,2
31,さぶろう,3

実行結果の改行がおかしな感じですね。これは文字列変数line_list[2]の中に代入された文字列に改行コードが含まれているのが原因です。修正方法は幾つかありますが、ここでは文字列のstrip()メソッドを用いてソースを修正してみましょう。

OKの例
Pythonソース
f = open(r"C:\Python_source\01_TextFileRead\SampleTextSJIS.csv",encoding="shift_jis")
for line in f:
    line_list = line.split(",")
    line_edit = "%s,%s,%s" % (line_list[2].strip(),line_list[1],line_list[0])  
    print(line_edit) 
実行結果

点数,名前,出席番号
96,たろう,1
68,じろう,2
31,さぶろう,3

修正したのは、4行目の文字列変数 line_list[2]にstrip()メソッドをつなげて改行コードを取り去っただけです。 strip()メソッドは改行コードだけでなく、文字列左右の空白も取り去ってくれる、便利なメソッドです。文字列には色々と便利なメソッドがあるので、調べて試してみてください。

それでは今日はこの辺で。

最後まで読んで頂き、ありがとうございました。

タイトルとURLをコピーしました