os.path.split

os.path.splitを使うとパス名とファイル名を分けることができます。

path = '/usr/bin/python'
print os.path.split(path)
# => ('/usr/bin', 'python')

str.splitを使って同じことをするならこんな感じでしょうか。

path = '/usr/bin/python'
print ('/'.join(path.split('/')[:-1]), path.split('/')[-1])
# => ('/usr/bin', 'python')

os.path.splitextを使うとファイル名と拡張子を分けることができます。

path = '/foo/bar/boo.py'
print os.path.splitext(path)
# => ('/foo/bar/boo', '.py')

path = '/foo/bar/boo/apple.orange.banana.py'
print os.path.splitext(path)
# => ('/foo/bar/boo/apple.orange.banana', '.py')

最後の . 以下が拡張子とみなされるみたいです。


str.splitを使って同じことをするならこんな感じでしょうか。

path = '/foo/bar/boo.py'
print ('.'.join(path.split('.')[:-1]), '.'+path.split('.')[-1])
# => ('/foo/bar/boo', '.py')

path = '/foo/bar/boo/apple.orange.banana.py'
print ('.'.join(path.split('.')[:-1]), '.'+path.split('.')[-1])
# => ('/foo/bar/boo/apple.orange.banana', '.py')

os.walk

os.walkを使うと任意のディレクトリ以下のファイル名を取得することができます。

# walk.py
import os
import sys

for root, dirs, files in os.walk(sys.argv[1]):
  for f in files:
    print os.path.join(root, f)

ディレクトリ構成が

  • walk.py
  • foo
    • apple.txt
    • bar
      • boo
        • orange.txt

こんな感じになっているものとして、./ 以下のファイルを表示してみます。

> python walk.py ./
./foo/apple.txt
./foo/bar/boo/orange.txt

os.path.joinはパスの要素をうまいこと結合してくれる関数です。

import os
print os.path.join('foo', 'bar', 'boo')
# => foo/bar/boo

print os.path.join('/foo', 'bar/', 'boo')
# => /foo/bar/boo

print os.path.join('/foo', 'bar/', '/boo')
# => /boo

最後の例は /boo が絶対パスだと認識されているのでしょうか……?

拡張子を変換する

任意のファイルの拡張子を変換するスクリプトを書いてみました。

# chext.py
import os
import sys

dir = sys.argv[1]
dste = '.' + sys.argv[2]
srce = ['.'+i for i in sys.argv[3:]]

for i in os.listdir(dir):
  path, ext = os.path.splitext(i)
  if ext in srce:
    srcf = os.path.join(dir, path+ext)
    dstf = os.path.join(dir, path+dste)
    os.rename(srcf, dstf)
    print srcf, '=>', dstf

第一引数で変換を行うディレクトリを指定し、ファイルが第三引数以下の拡張子だった場合、第二引数の拡張子に変換します。

./ の中身が

となっているものとして、拡張子 jpeg/jpe/JPG を jpg に変換するには以下のように実行します。

> python chext.py ./ jpg jpeg jpe JPG
./apple.jpeg => ./apple.jpg
./banana.JPG => ./banana.jpg
./orange.jpe => ./orange.jpg

os.walkを使うと指定したディレクトリ以下、全てのファイルを対象として拡張子を変換するスクリプトが書けます。

# chext_walk.py
import os
import sys

dir = sys.argv[1]
dste = '.' + sys.argv[2]
srce = ['.'+i for i in sys.argv[3:]]

for root, dirs, files in os.walk(dir):
  for f in files:
    path, ext = os.path.splitext(f)
    if ext in srce:
      srcf = os.path.join(root, path+ext)
      dstf = os.path.join(root, path+dste)
      os.rename(srcf, dstf)
      print srcf, '=>', dstf

ディレクトリ構成が

  • chext_walk.py
  • foo

こんな感じになっているものとして、./foo 以下のファイルの拡張子 jpeg/jpe/JPG を jpg に変換するには以下のように実行します。

> python chext_walk.py ./foo jpg jpeg jpe JPG
./foo/apple.jpeg => ./foo/apple.jpg
./foo/bar/banana.JPG => ./foo/bar/banana.jpg
./foo/bar/boo/orange.jpe => ./foo/bar/boo/orange.jpg