2012/12/18

文系のための「ディレクトリ構造」(2)

ディレクトリの基本的な用語を整理したところで、
今度は、実際にPythonを使ってディレクトリに関する知識を深めてみる。
今回の話は、今後、自分でプログラムを書く上で役立つハズ。

さて、本題に入る前に、二つほど質問。
あなたが使っているパソコンの「OS」は何か?
また、そのOSの「バージョン」は何であるか?

この質問の意味が解らない人は、
文系のための「情報管理」の話を最初から読んだほう良い
おそらく、この先の話、何を書いているか、理解するのが難しい。

さて、すでに述べたように、Windows系OSUnix系Mac OS Xも含む)のOSでは、
ディレクトリの表示方法が異なるのであった。忘れている人は前の話を参照。
また、バージョンによっては既定のディレクトリの配置場所も異なる

ところで、OSには、シングルユーザ環境と、マルチユーザ環境というのがある。
一人で使うことを前提としているのか?複数で使うことを前提としているのか?
自分が使っているパソコンのOSの環境はどちらであろうか?

複数の人が一つのパソコンを使う際には、データの保存場所や、
デスクトップの壁紙メールの設定など、個人設定の領域を分けれた方が良い。
マルチユーザ環境とは、要するに、こうした状況を可能にすることである。

このブログの読者で、Unix系のOSの人は、かなり高い確率でマルチユーザ環境
Windows系OSの人は、Windows 2000 以降の人はマルチユーザ環境であり、
Windows 95、Windows 98、Windows MEの人は、おそらく、シングルユーザ環境

実を言うと、Windows XPでさえも、すでにサポートが打ち切りになっているので、
上に挙げたWindows系のOSを使っている人は、新しいOSに変えた方が良い
なりすまし事件」が話題になったが、サポートが切れたOSを使うのは極めて危険

さて、話を戻そう。なぜ、この話を最初にしたかというと、
今回は「ホームディレクトリ」という特殊なディレクトリを扱うため。
これを意識している一般ユーザは少ないかもしれないが、非常に重要

ホームディレクトリというのは、ユーザが自由に読み書きできるディレクトリのこと。
OSの根本に関わる部分や、様々なアプリに関わる部分というのは、非常にデリケートで、
知らない人が触ると、最悪の事態として、コンピュータが動かなくなる

可能な限り、通常のユーザがシステムに関わる部分を傷つけないようにするために、
基本的にはホームディレクトリに個人に関わるファイルを纏めるようになっている。
また、このようにすることでマルチユーザ環境でユーザごとの設定も分けやすくなる。

もっとも、どれをいじってもシステムに影響しないとは言えないが…

さて、今回は、そのホームディレクトリディレクトリで色々と実験する。
では、肝心のホームディレクトリはどこにあるのか?
実は、OSとOSのバージョンによって異なる

以下、比較的に有名なOSとそのバージョンごとのホームディレクトリの場所
自分が使っているOSが下に無い場合は、自分で検索を。流石に網羅できない…。
  • Windows系
    • Windows 95     :C:\My Documents
    • Windows 98     :C:\My Documents
    • Windows Me     :C:\My Documents
    • Windows NT     :C:\WINNT\Profiles\ユーザ名
    • Windows 2000   :C:\Documents and Settings\ユーザ名
    • Windows XP     :C:\Documents and Settings\ユーザ名
    • Windows Vista  :C:\Users\ユーザ名
    • Windows 7      :C:\Users\ユーザ名
    • Windows 8      :C:\Users\ユーザ名
  • Unix系
    • Ubuntu(Debian) :/home/ユーザ名
    • Fedora(Red Hat):/home/ユーザ名
    • Max OS X       :/Users/ユーザ名
Windows系ホームディレクトリの表示について、
」と表示されている人と、「」と表示されている人がいるハズ。
これは利用環境に依存する。以下では「」と表示されていることを前提に進める。

さて、上記で「ユーザ名」と書かれている部分はログイン名に対応する。
パソコン購入して最初に起動した時、あるいは、OSを入れなおした際に設定したハズ
ちなみに、英語名で設定しておいた方がプログラムを書く時には楽。変換の手間が無い。

さて、では、いよいよPython でプログラムを書いていくことにする。
まずは、Pythonコンソールを立ち上げる。「>>>」というのが表示されるのを確認。
基本的な解説は、データ型の話でしているので、以下を理解できない人はそこから。

以下のプログラムを見て、自分で書きなおす場所は解るだろうか?
"ここに自分のホームディレクトリのパスを書く"の部分を自分で書き直す。
この部分、文字列型なので、「'」あるいは「"」で囲むことを忘れずに。

import os

home = "ここに自分のホームディレクトリのパスを書く"

for subdirectory in os.listdir(home):
    print(subdirectory)

OSが提供する機能を用いるので、最初に「import os」で必要なライブラリを読み込み
次に、home という変数に、自分のホームディレクトリの「パス」を代入する。
その後のループ文(For文)を使って、ホームディレクトリの中身を出力する。

ループ文の「for subdirectory in os.listdir(home):」の部分では、
ホームディレクトリ内のディレクトリ名ファイル名をリスト化し、
ループ処理を繰り返す度にリストの内の一つを subdirectory という変数に代入している。

ループ内で行われている処理は一つだけ。「print(subdirectory)」の部分。
subdirectory という変数に入っているディレクトリあるいはファイル名を表示する。
そして、「os.listdir(home)」に格納されているリストを全て表示したら終了

ひょっとしたら、非常に長い時間がかかるかもしれない。
途中で止めたいときにはキーボード上で「Ctrl」を押しながら「c」のキーを押す
すると、処理が強制中断される。ということで、各自、実行!

コンソールファイル名ディレクトリ名の一覧が出れば成功!
上手くいっただろうか?ここでは、ホームディレクトリを指定し、
そこを「ルートパス」とした「相対パス」で一覧を表示したことになる。

では、今度は、絶対パスでファイルの一覧を取得してみる。

import os

home = "ここに自分のホームディレクトリのパスを書く"

for subdirectory in os.listdir(home):
    fullpath = os.path.join(home, subdirectory)
    print(fullpath)

さて、先程のコードとどの部分が変更されているだろうか?
よく見ると、ループ文の中の処理が一つ追加されている。
fullpath = os.path.join(home, subdirectory)」の部分である。

os.path.join(home, subdirectory)」というのは、二つのパスを繋げる機能
この場合は、変数home(ホームディレクトリ) に格納されているパス名と、
変数subdirectory(ファイル名とディレクトリ名) に格納されているパス名を結合する。

このようにして結合したパス名を新しく定義した「fullpath」に代入し、
print(fullpath)」の部分で、結果を表示している。
これを実行すると、「絶対パス」でファイル名ディレクトリ名が表示できる。

この方式、面倒かもしれないが、階層が深くなっていくと書く量が少なくて済む
また、ソフトウェアは実際に何かのファイルディレクトリを操作する際には、
このように、ルートパスの部分と相対パスの部分を結合し「絶対パス」で指定する。

このことが直感的に解ってしまえば今回の話はこれで終わっても良いのだが…。
折角なので、もう少し、このプログラムの改良を続けてみる。
今度は、ディレクトリ名のみを抽出する。


import os

home = "ここに自分のホームディレクトリのパスを書く"

for subdirectory in os.listdir(home):
    fullpath = os.path.join(home, subdirectory)
    if os.path.isdir(fullpath):
        print(fullpath)

今度は、「if os.path.isdir(fullpath):」という部分が追加され、
print(fullpath)の前のインデント(空白)が一つ右に移動している。
ループ文の中に、さらに、別の処理が「入れ子」になって入っている

さすがに、英語の「if」の意味は解るであろう…まさか…。「もしも」の意。
ここでは、「os.path.isdir(fullpath):」という条件を満たした場合にのみ
print(fullpath)を実行するようになっている。

os.path.isdir(fullpath):」というのもよく見れば、何をしているか予想できるだろう。
isdir()」の部分は、「() is directory」にも見える。つまり、「()はディレクトリ」。
要するに、「()」内の文字列がディレクトリの場合に「正しい」と言ってくれる機能

慣れてくると、この手の機能は、ほぼ勘で呼び出すことができるようになる。
プログラミングは、基本的に言語なので、慣れてしまえば簡単。
言語体系を扱うのは文系分野の領域プログラミング・スキルは文系に向いている

さて、この処理を実行すると、ディレクトリのみをリストとして表示できる。
使用しているOSとその環境に依存するので一概には言えないが、
最近のOSを使っている人は、「Desktop」というのも含まれているハズ。

マルチユーザ環境において、ホームディレクトリには、あらゆる個人設定が保存される
職場の共有パソコンなどで、別のユーザがログインすると、
そのユーザのデスクトップが表示されるハズ。他の人のは見えない…普通は。

これは、ユーザごとにホームディレクトリが設定されていて、
ログインするとログイン名に対応したホームディレクトリが読み込まれるのである。
もちろん、通常の設定では、別のユーザのホームディレクトリはロックされて見れない

さて、今回は、ディレクトリの構造を知るために本格的な(?)プログラムを書いた。
また、「マルチユーザ環境」と「ホームディレクトリ」の話もした。
これらは、普段は意識することが少ないかもしれないが、実は重要

これらの知識を持っていることは、特に、複数のメンバーで行う調査などで重要
調査終了後に皆のデータを統合する際にディレクトリを揃えておくと楽なのである。
ただし、これは、メンバー全員がディレクトリの概念を知っていることが前提…

どこかの偉い大先生が堂々と、「文系はそういった知識は不要!」と言っていた。
そのような時代がかつては「あったのかもしれない」が、今はそんな時代では無い
少し退屈な話かもしれないが、こういった知識はしっかりと身につける必要がある

0 件のコメント:

コメントを投稿