Pythonでcsv、tsvの扱い方 〜ファイルの作成&読み書き〜

スポンサーリンク

csv、tsvとは?

csv、tsvとはファイル形式のことで、それぞれComma-Separated Values、Tab-Separated Valueの略になります。

日本語でいうと、カンマで分けた値とタブで分けた値といったところでしょうか。

csvもtsvもセンサや計測器から得られたデータを保存するためによく使われていますし、またインターネットからダウンロードできる統計情報などのエクセルファイルをcsv、tsv形式に変換し、Pythonで処理をするといったこともできます。

今後、3PySciでもPythonを用いたデータ解析手法に関して解説する予定ですが、今回はいち早くデータの取り扱いに関して解説します。

csv形式とtsv形式のファイルでは、データは以下のように保存されています。

表形式と比較すると、csvではカンマ(,)で列を表現し、改行で行を表現しています。

またtsvではタブで列を、改行で行を表現しています。

tsvの場合はスペースと混同することもあるため、個人的にはcsvの方がデータとして、分かりやすく使いやすいと感じています。

ただ計測器によっては、tsv形式でデータを出力することがあるため、どちらにも対応できるようにしておくのがよいでしょう。

スポンサーリンク

エクセルのデータをcsv、tsvに変換

csvやtsvの形式のデータなんて持ってないよという人のために、エクセルのデータをcsv、tsv形式に変換する方法を解説します。

今回は先ほどの上でcsv、tsv形式の解説した時の数値を使ってみます。

ちなみにインターネットから得られたエクセルデータも同様に変換することができますので、ぜひ変換方法は覚えておいてください。

(注:私のエクセルは古いのでインターフェースとか違うかもしれません)

とりあえずエクセルを起動し、数値を入力しました。

メニューの「ファイル」から「名前をつけて保存」を選択します。

「名前」を記入し、フォーマットのプルダウンメニューを開きます。

csv形式で保存したい場合は、「CSV(コンマ区切り)(.csv)」を選択。

tsv形式で保存したい場合は、「タブ区切りテキスト(.txt)」を選択。

何やら警告がでますが、気にせずに続行してください。

またtsv形式の場合は、拡張子が「.txt」となっているので、「.tsv」に変更します。

これでcsv、tsv形式で保存できました。

とりあえず例としてファイルを置いておきますので、良かったら練習用に使ってください。

(tsv形式はアップロードできなかったので、拡張子が「.txt」のものをアップロードしてあります。ダウンロード後、拡張子を「.tsv」に変更してください。)

スポンサーリンク

Pythonでのcsv、tsvファイルの読み込み

ここからやっとPythonでのプログラミングに入ります。

まず最初に先ほど作成したcsvファイルとtsvファイルを使用しますので、これから書くPythonプログラムを保存するフォルダと同じフォルダに移動してください。

Pythonでcsv、tsvファイルを扱うには、最初にcsvを使うよと宣言する必要があります。

この宣言することを「インポートする」と言います。

インポートする「もの」のことをモジュールと言ったり、ライブラリと言ったり、パッケージと言ったり、何やら分類があるみたいですが、あまり気にしないでください。

モジュール、ライブラリ、パッケージに関して勉強したい方は、以下のサイトが分かりやすいです。

Pythonのモジュール、パッケージ、ライブラリ徹底解説! - AI-interのPython3入門
Pythonにおけるモジュール、パッケージ、ライブラリについて初心者向けに解説した記事です。用語の説明、インストールの方法、使い方などプログラミング未経験者や初心者でもわかりやすいよう、丁寧に解説しています。

それではまず、csvのインポートをしてみます。

import csv

実行結果

これでインポート完了です。実行しても何も出ませんが、気にしないでください。

ちなみにインポートは1つのプログラムで1回で大丈夫です。

ですので、続く処理は同じセルに書いても、次のセルに書いても「import csv」の効果は有効です。

もちろん違うプログラムの時には再度必要となるので、プログラム毎にインポートしてください。

通常私は最初のセルはモジュールやライブラリのインポートのみに使い、処理は次のセルに書いていきます。

とりあえず3PySciでは、どこからでも始められるようcsvモジュールを使用する全てのプログラムに書いておきます。

まずはファイルを開く指示を出します。

f = open("csv_example.csv", "r")

print(f)

実行結果
<_io.TextIOWrapper name='csv_example.csv' mode='r' encoding='UTF-8'>

このコマンドを解説すると、open()の中で、ファイル名と開き方を指定し、openでファイルを開きます。

そして、そのファイルの中にある情報を変数fに代入しています。

つまりこれ以降は開いたファイルは f で使うことができます。

ただprint()では読み取れない形になっているため、上記の実行結果ではエラーっぽく表示されていますが、これでちゃんとファイルを開くことができています。

またopen()にある”r”とは読み取り専用で開くコマンドです。

“r”の他にも”w”、”a”というコマンドがありますが、これは後ほど説明します。

また開いたファイルは使わなくなったら、閉じることも忘れずに。

見た目上変わりませんが、パソコンのリソースを使いっぱなしになってしまいます。

閉じるには以下のcloseというコマンドを使います。

f = open("csv_example.csv", "r")

f.close()

次は開いたファイルがcsvだよと教えてあげるコマンドです。

import csv

f = open("csv_example.csv", "r")
reader = csv.reader(f)

print(reader)

f.close()

実行結果
<_csv.reader object at XXXXXXXXXXX>

2行目の「reader = csv.reader(f)」により f はcsvファイルであると教え、丸ごとreaderに代入しています。

もしtsvファイルであるときは、次のコマンドになります。

import csv

f = open("tsv_example.tsv", "r")
reader = csv.reader(f, delimiter="\t")

print(reader)

f.close()

実行結果
<_csv.reader object at XXXXXXXXXXX>

delimiter = “\t”がcsv.readerの括弧の中に追加されています。

これがデータの区切り文字を指定するコマンドで、”\t”がタブを示す文字になります。

このように区切り文字を指定することにより、ファイルの区切り文字をcsvの区切り文字のカンマから、他の文字に変更することができます。

でもまだまだprint関数では読み出せない形式なので、やっぱり実行結果がエラーっぽくなっています。

最初に記載した通り、csvはカンマで、tsvはタブで列が区切られており、行はどちらも改行で区切られています。

現在、readerには全ての列、行が保管されていますが、一度に出力することはできません。

そのためこの形式のファイルを読み出すには、1行ずつ出力する必要があります。

ここで使用するのはfor関数です。

Pythonで繰り返し処理 for関数の超基本的な使用法
Pythonで繰り返し処理をするための関数Pythonで繰り返し処理するには、2つの関数が存在します。1つは今回紹介するfor関数で、もう1つはwhile関数です。簡単に違いをいうと、ある特定の回数の繰り返し処理す...

readerをfor関数で1行ずつ取り出して、print関数で出力します。

まずはcsvファイルから。

import csv

f = open("csv_example.csv", "r")
reader = csv.reader(f)

for row in reader:
    print(row)

f.close()

実行結果
['1', '63']
['2', '47']
['3', '82']
['4', '15']
['5', '79']

tsvファイルでも、同じように出力できます。

import csv

f = open("tsv_example.tsv", "r")
reader = csv.reader(f, delimiter="\t")

for row in reader:
    print(row)

f.close()

実行結果
['1', '63']
['2', '47']
['3', '82']
['4', '15']
['5', '79']

読み出したデータは単に表示するよりも、リストに格納して他の処理を行ったりすることが多いです。

import csv

f = open("csv_example.csv", "r")
reader = csv.reader(f)

value = []

for row in reader:
    value.append(row)
    
print(value)

f.close()

実行結果
[['1', '63'], ['2', '47'], ['3', '82'], ['4', '15'], ['5', '79']]
スポンサーリンク

ファイルの新規作成と書き込み

ファイルの新規作成はファイルを開く時の開き方を”w”にします。

f = open("test.csv", "w")

f.close()

すると今使っているフォルダに新しく「test.csv」というファイルができていることでしょう。

データを書き込むには、まずはcsvで書き込むよと教えてあげます。

import csv

f = open("test.csv", "w")
writer = csv.writer(f)

f.close()

またtsvで書き込む場合は、読み込む時と同じくdelimiterを用います。

import csv

f = open("test.csv", "w")
writer = csv.writer(f, delimiter="\t")

f.close()

これ以降はcsvでもtsvでも同じなので、tsvに関しては省略します。

実際にデータを書き込むのは、writer.writerowを用います。

writerowとある通り、1行ずつ書き込みますが、その時に列に関しては、リストを用いて書き込みます。

import csv

f = open("test.csv", "w")
writer = csv.writer(f)
writer.writerow([1, 63])

f.close()

「test.csv」を開いてみると、ちゃんと書き込まれていることが分かります。

複数行書き込む時は、writer.writerowを繰り返すと複数行書き込むことができます。

import csv

f = open("test.csv", "w")
writer = csv.writer(f)
writer.writerow([1, 63])
writer.writerow([2, 47])
writer.writerow([3, 82])
writer.writerow([4, 15])
writer.writerow([5, 79])

f.close()

ここで注意して欲しいのは、ファイルを開く時に開き方を”w”とすると、毎回新規作成されるため、既存のファイルに対し、追加書き込みはできないということです。

追加書き込みをするには、ファイルの開き方を”a”とします。

追加するデータは、前とは異なる数値を用いました。

import csv

f = open("test.csv", "a")
writer = csv.writer(f)
writer.writerow([6, 25])
writer.writerow([7, 64])
writer.writerow([8, 98])
writer.writerow([9, 17])
writer.writerow([10, 38])

f.close()

ちゃんと前のデータに追加書き込みされています。

また指定したファイルがない場合、新規作成されます。

ですがこの”a”を用いてファイルを開く場合には、何度も実行すると実行した回数だけ、データが追加されてしまうので、気をつけてください。

先ほどのプログラムを何も変更をせずに、再度実行するとこうなります。

import csv

f = open("test.csv", "a")
writer = csv.writer(f)
writer.writerow([6, 25])
writer.writerow([7, 64])
writer.writerow([8, 98])
writer.writerow([9, 17])
writer.writerow([10, 38])

f.close()

6,25から10,38までが2回繰り返されていることが分かります。

また”w”や”a”で開いたファイルは、readerで読み込めません。

import csv

f = open("test.csv", "w")
reader = csv.reader(f)

for row in reader:
    print(row)

f.close()

実行結果
---------------------------------------------------------------------------
UnsupportedOperation                      Traceback (most recent call last)
<ipython-input-XX-XXXXXXXXXXXX> in <module>
      2 reader = csv.reader(f)
      3 
----> 4 for row in reader:
      5     print(row)
      6 

UnsupportedOperation: not readable
import csv

f = open("test.csv", "a")
reader = csv.reader(f)

for row in reader:
    print(row)

f.close()

実行結果
---------------------------------------------------------------------------
UnsupportedOperation                      Traceback (most recent call last)
<ipython-input-XX-XXXXXXXXXXXX> in <module>
      2 reader = csv.reader(f)
      3 
----> 4 for row in reader:
      5     print(row)
      6 

UnsupportedOperation: not readable

ちなみに逆に”r”で開いたファイルに書き込みはできません。

import csv

f = open("test.csv", "r")
writer = csv.writer(f)

writer.writerow([1, 63])

f.close()

実行結果
---------------------------------------------------------------------------
UnsupportedOperation                      Traceback (most recent call last)
<ipython-input-XX-XXXXXXXXXXXX> in <module>
      2 writer = csv.writer(f)
      3 
----> 4 writer.writerow([1, 63])
      5 
      6 f.close()

UnsupportedOperation: not writable

こういったミスが起こりがちですので、ファイルの開き方に関しては注意し、必要以上な処理がされないよう、開くことが肝心です。

スポンサーリンク

ファイルの開き方まとめ

開き方処理(ファイルがある場合)処理ファイルがない場合
r読むエラー
w新規作成して書き込む新規作成して書き込む
a追加書き込み新規作成して書き込む

csvファイル、tsvファイルの読み書きに関してはこんな感じです。

次回はフォルダ間の移動やファイル名やフォルダ名の取得方法、そのための絶対パスや相対パスに関しての知識を解説していきます。

Pythonのosモジュールによるフォルダ間移動とファイル名取得 〜絶対パスと相対パスの違いを添えて〜
フォルダ間移動前にcsvファイルの書き込みに関して説明しました。その際はプログラムと読み込むファイルは同じフォルダにある必要があり、また新規作成されるファイルは同じフォルダに作成されました。しかしプログラムとファイ...

ということで今回はこんな感じで。

コメント

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