Python

Pythonを使って様々なOSモジュールの使い方を解説

マルチデバイス

Pythonを使って、マルチデバイス対応のアプリケーションを作成するためには、OSモジュールについて知る必要があります。

OSモジュールでは、WindowsやLinux、MacといったOSで動くものや動かないモジュールもあります。

この記事では、実際に動かしてみて検証した内容を解説しています。

環境変数へアクセス

各OSの環境変数へアクセスするため方法になります。

アクセスするには、environを利用します。

実行するコードは下記になります。

import os

home = os.environ['HOME']
print(home)

まずは、osをインポートします。

3行目のenvironでHOMEを指定することで、各OSのHOMEを取得することができます。

Windowsの結果は下記になります。

C:から普通に取れているのでWindowsでも問題なく動作しています。

ただWindowsでは、取得できないものもある様なので注意が必要です。

C:\Users\xxxx <- ユーザ名です 

MacとLinuxの結果は下記になります。

Macの場合は、Usersから始まってユーザ名になります。

/Users/xxx <- ユーザ名です

Linuxでも問題なく取得することができました。

/home/xxx <- ユーザ名です。

現在の実行場所の確認

Pythonが動いている場所がどこなのか確認することができます。

getcwdを利用することで、3つOSともに問題なく動作することが確認できました。

Windowsの結果は下記になります。

>>> import os
>>> os.getcwd()
'C:\\Users\\ユーザ名\\AppData\\Local\\Programs\\Python\\Python39'
>>> 

MacとLinuxの結果は下記なります。

下記のコードをMacとLinuxで実行してみました。

getcwdが現在Pythonが実行している位置を取得するモジュールになります。

import os

pwd = os.getcwd()
print(pwd)

Macの場合の結果

/Users/ユーザ名/project/to/path

Linuxの場合

/home/ユーザ名/project/to/path

両方とも問題なく動作しました。

セパレート文字の取得方法

WindowsとLinuxまたはUnixでは、ディレクトリ(フォルダ)を区切る文字が違います。

そのため、マルチデバイス対応のアプリケーションを作成する場合は気をつける必要があります。

Windowsの場合は¥マークになり、LinuxやUnix、MacOSは/マークになります。

実際に確かめてみます。

まずはWindowsで実行してみます。

取得する方法は、os.sepになります。

>>> import os
>>> print(os.sep)
¥

MacやLinuxで確かめてみます。

import os

print(os.sep) # <- /が返ってきます。

OSによって改行文字や文字コードが違う

WindowsとMacOSやLinux・Unixによって改行文字が違います。

単純に分けるとWindowsが\r\nになり、他のOSでは\nになります。

MacやLinuxなどのOSで慣れていると、ファイル操作とかでWindowsがめんどくさくなるんですよね。

特に文字コードの扱いとかですね。

Windowsは基本的にWindows-31Jです。

以前はShift-JISだったのですが、統合されてWindows-31Jになっています。

Linuxの10年前の主流はEUCとかだったのですがバグとかあって、今ではUTF系が主流になっています。

そのため、MacやUnixもUTFになっています。

なので、その辺のコード変換をしっかりできていないシステムでCSVをダウンロードするとWindowsで文字化けが発生します。

逆もしかりですね。

余談を挟みましたが、改行コードを取得する方法は下記になります。

import os

lineend = os.extsep

ディレクトリ(フォルダ)の中身を確認

ディレクトリ(フォルダ)中身をリストとして取得するには、listdirを使います。

listdirの引数は下記になります。

listdir(ディレクトリのパス)

今いる場所のディレクトリを調べるプログラムが下記になります。

import os

l = os.listdir('.')
print(l)

3行目のピリオドは、今いる場所を指します。

詳しく知りたい方は、相対パスで調べると出てきます。

結果は下記になります。

['os_sample.py']

ディレクトリの中身を配列で返しているのがわかります。

os_sample.pyは実行したファイルになっており、それ以外のファイルやディレクトリがないです。

Windowsでも実際に試して動くことを確認しました。

Windows listdir実行結果

ディレクトリ(フォルダ)の作成

パスで指定されたディレクトリ(フォルダ)を作成します。

ディレクトリを作成するには、mkdirを使います。

mkdirの引数は下記になります。

mkdir(ディレクトリ名)

実際にディレクトリ作成するプログラムは下記になります。

import os

dirname = 'mk_sample'
os.mkdir(dirname)

l = os.listdir('.')
print(l)

3行目は、ディレクトリの名前を変数に入れています。

4行目でディクトリを作成しており、6行目で作成できているか一覧を取得しています。

結果は、下記になります。

['os_sample.py', 'mk_sample']

mk_sampleというディレクトリ(フォルダ)が作成できていました。

ここで注意が必要になります。

2回目を実行するとディレクトリが作成されているのでエラーになります。

エラー内容は下記になります。

Traceback (most recent call last):
  File "/Users/ユーザ名/project/to/path/os_sample.py", line 4, in <module>
    os.mkdir(dirname)
FileExistsError: [Errno 17] File exists: 'mk_sample'

エラー内容は、すでにmk_sampleがありますよってエラーになります。

そのため、ファイルやディレクトリ(フォルダ)の存在チェックか例外処理の対応が必要になってきます。

例外処理だと下記のような感じです。

try:
    os.mkdir(dirname)
except FileExistsError as e:
   print(e)

ファイルやディレクトリ(フォルダ)の存在チェック

ファイルやディレクトリのあるかどうかをチェックするには、existsを使います。

existsはos.pathの中にあり、osの中に無いので注意してください。

ソースコードは、ディレクトリ作成を流用します。

import os
from os.path import exists

dirname = 'mk_sample'

if not exists(dirname):
    os.mkdir(dirname)

l = os.listdir('.')
print(l)

まずは、existsをインポートします。

6行目のIF文を使うことで、ディレクトリがあった場合は作らないようにしています。

なので、notをつけることで、existsはファイルやフォルダがあった場合Trueを返すので反転して作成される形になります。

existsは、ファイルやディレクトリをチェックしますが、ファイルだけやディレクトリだけをチェックしたい場合があります。

その場合は、isdirやisfileを利用します。

Windowsでも問題なく動作可能です。

ファイルやディレクトリ(フォルダ)の名前を変更する

ファイルやディレクトリ(フォルダ)の名前変更処理を行うには、renameを使います。

下記がrenameの引数です。

rename(変更前, 変更後, *, src_dir_fd=None, dst_dir_fd=None)

第3引数からの使い方が分からないので、第2引数までの使い方だけ載せます。

ソースは、ディレクトリ作成で利用したものを使います。

import os
from os.path import exists

dirname = 'mk_sample'

if not exists(dirname):
    os.mkdir(dirname)

dst_name = 'dist_name'
os.rename(dirname, dst_name)

l = os.listdir('.')
print(l)

6行目でディレクトリがなければ作成します。

10行目でmk_sampleをdist_nameにリネームしています。

結果は下記になります。

['os_sample.py', 'dist_name']

Windowsでも実際に試しましたが、問題なく動作します。

Windows Python 名称変更動作確認

ディレクトリ(フォルダ)の削除

ディレクトリ(フォルダ)の削除を行います。

削除するには、パスを指定するだけになります。

rmdir(削除したいディレクトリのパス)

リネーム処理で利用したソースコードを使って、削除処理を追加します。

import os
from os.path import exists

dirname = 'mk_sample'

if not exists(dirname):
    os.mkdir(dirname)

dst_name = 'dist_name'
os.rename(dirname, dst_name)

os.rmdir(dst_name)

l = os.listdir('.')
print(l)

12行目が今回追加した、削除処理になります。

このプログラムの流れは、まずディレクトリの有無をチェックしています。

無ければ作成します。

次に、作成したディレクトリをリネームしています。

10行目の処理がそれにあたります。

削除は先ほど書いた通り12行目で行っています。

14行目で、実行したディレクトリの中身を一覧取得して表示しています。

下記が結果になります。

['os_sample.py']

実行したファイルしか残らない状態になります。

まとめ

Pythonでも、WindowsやMac、LinuxといったOSでも、アプリケーションの作成を行うことができます。

今回、セパレート文字やディレクトリ(フォルダ)の作成といった、WindowsやMac、Linuxでも問題なく動作するものを紹介しました。

MacやLinuxでは、chownといったオーナーによるアクセス権限によって、データの取得をすることができます。

しかし、Windowsでは動かなといったこともあるので、OSに依存しないアプリケーションを作る際には気をつけてください。

-Python
-