プログラムを作る際には、ファイルのパスを操作することが多々あります。パスはディレクトリ(フォルダ)やファイルを保存している場所です。Pythonにはパスを簡単に操作するための関数が揃っています。
今回は、Pythonでファイルのパスを操作する方法について解説します。

パスを分割する

splitでディレクトリ名とファイル名を分割する

パスを分割するうえで一番使われるのがディレクトリ名とファイル名を分割することです。そのためにはos.pathモジュールのsplit()を使います。

import os
変数1, 変数2 = os.path.split(‘パス’)

split()はosモジュールに含まれるので、必ずosをインポートしましょう。split()にパスを渡すと、パスをディレクトリとファイルに分割して返します。変数1にはディレクトリ名、変数2にはファイル名がそれぞれ格納されます。

import os
path = 'C:\\python35\\test.txt'
dict, file = os.path.split(path)
print('ディレクトリ名:{}, ファイル名:{}'.format(dict,file))

実行結果

ディレクトリ名:C:\python35, ファイル名:test.txt

splitextでパスを拡張子で分割する

パスを操作する際には、パスを拡張子で分割したいことがあります。これはパスが文字列であることを利用し、for文とスライス操作で拡張子で分割することができます。

path = 'C:\\python35\\test.txt'
i = 0
for x in path:
    if(x == '.'):
        break;
    i += 1
ext = path[i:]
other = path[:i]
print('拡張子:{}, そこまでのパス:{}'.format(ext, other))

実行結果

拡張子:.txt, そこまでのパス:C:\python35\test

拡張子でパスを分割できましたが、コードが長くなってしまいますね。わざわざfor文を使わなくても、文字列のindex()を使えばもっと短くなりそうです。

path = 'C:\\python35\\test.txt'
index = path.index('.')
ext = path[index:]
other = path[index:]
print('拡張子:{}, そこまでのパス:{}'.format(ext, other))

実行結果

拡張子:.txt, そこまでのパス:C:\python35\test

for文を使うよりはかなり短くなりました。しかし、osモジュールに用意されているsplitextを使うことで、さらに短い記述で拡張子での分割を実現することができます。

import os
path = 'C:\\python35\\test.txt'
other, ext = os.path.splitext(path)
print('拡張子:{}, そこまでのパス:{}'.format(ext, other))

実行結果

拡張子:.txt, そこまでのパス:C:\python35\test

splitextを使うと、簡単にパスを拡張子で分けることができます。split()のように変数を2つ用意し、左側の変数に拡張子を除いたパス、右側の変数に拡張子が格納されます。splitextの引数に拡張子がない場合はパスと空の文字列が返されます。

import os
path = 'C:\\python35\\'
other, ext = os.path.splitext(path)
print('拡張子:{}, そこまでのパス:{}'.format(ext, other))

実行結果

拡張子:, そこまでのパス:C:\python35\

2. パスを連結する
split()やsplitext()を使って分割したパスを組み合わせて別のパスを作るとします。split()やsplitext()は分割したものを文字列として返すので、文字列を足し合わせるようにすることで連結することができます。

import os
path1 = 'C:\\python35\\test.txt'
path2 = 'C:\\python27\\test2.csv'
other1, ext1 = os.path.splitext(path1)
other2, ext2 = os.path.splitext(path2)
print('拡張子:{}, そこまでのパス:{}'.format(ext1, other1))
print('拡張子:{}, そこまでのパス:{}'.format(ext2, other2))
new_path = other1 + ext2
print('新しいパス:{}'.format(new_path))

実行結果

拡張子:.txt, そこまでのパス:C:\python35\test
拡張子:.csv, そこまでのパス:C:\python27\test2
新しいパス:C:\python35\test.csv

これでもパスの連結はできます。しかし、普通に文字列を連結してパスを作ると、余計な文字が付いたり、逆に足りなかったりすることがあります。
今、C\python27\というディレクトリの中身が以下のようになっているとします。

test

このtestというディレクトリの中に、新しいファイルを作るために以下のようなプログラムを実行します。

path1 = 'C:\\python35\\test.txt'
path2 = 'C:\\python27\\test\\test2.csv'
other1, ext1 = os.path.split(path1)
other2, ext2 = os.path.split(path2)
new_path = other2 + ext1
f = open(new_path, 'w')
f.write('新しいファイルです')

path1を分割してできた「text.txt」というファイル名とpath2を分割してできたtestディレクトリまでのパスを足し合わせてtestディレクトリの中にtest.txtというファイルを作ろうとしています。
ところがこのプログラムを実行してもtestフォルダの中には何も作られず、C:\python27の中が以下のようになります。

test
testtest.txt

実はパスとファイル名の間に「\」を忘れていたため、new_pathの中身が「C:\python27\testtest.txt」になっていたのです。こういったミスをなくすために、パスを連結する際はjoin()を使いましょう。

path1 = 'C:\\python35\\test.txt'
path2 = 'C:\\python27\\test\\test2.csv'
other1, ext1 = os.path.split(path1)
other2, ext2 = os.path.split(path2)
new_path = os.path.join(other2,ext1)
f = open(new_path, 'w')
f.write('新しいファイルです')

実行結果

(C:\python27\testの中身)
test.txt

os.path.joinはパス名とファイル名を結合する関数です。その際に、パスとファイルの間に「\」があるかどうかを判断し、ない場合は自動で付け足してくれます。これにより、「\」の付け忘れを防ぐことができます。もちろん、正しいパスを渡した場合はそのまま結合してくれます。パスを結合する際には、os.path.joinを使うようにしましょう。
【おすすめ記事】
Pythonを学びたい方は必見!おすすめスクールまとめ5選
【無料で使える】Pythonを勉強できる学習サイト7つ
Pythonの本・参考書の評判
【Python入門】if 文での真偽判定の仕方(TrueとNone)
【Python入門】モジュールを扱う際に重要な「if __name__ == ‘__main__’:」とは?