ラベル ディレクトリ の投稿を表示しています。 すべての投稿を表示
ラベル ディレクトリ の投稿を表示しています。 すべての投稿を表示

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」というのも含まれているハズ。

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

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

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

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

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

2012/11/11

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

パソコンの多くは、ハードディスクUSBメモリCD/DVDSDカードなど、
様々な種類の記憶媒体の中にデータを保存している。
そして、必要に応じて、必要なデータをそこから呼び出す。

深く考えた事は無いかもしれないが、考えてみれば当たり前。
では、どこに保存されていて、どのようにしてそれを特定し、アクセスしているのか?
今回は、この仕組みを大雑把に整理してみる。これが本日のテーマ。

パソコン上で扱うデータは、通常「ファイル」と呼ばれるものを単位とし、
そのファイルを格納しているものを「フォルダ」と呼ぶ事が多い。
ということで、今回の話では「フォルダ」の話から整理していくことにする。

さて、多くの人には「フォルダ」という言葉の方がなじみ深いかもしれないが、
パソコンのより深い部分に関わっている人は「ディレクトリ」という言葉を使う。
今の段階では、同義語として理解していて問題はない。

「フォルダ」=「ディレクトリ」

ディレクトリというのは、英語では「directory」と表記する。
日本語に訳すると「住所録」という意味。「ファイルの住所」とも言える。
実は、プログラムを書く人々には、この表現の方が直感に合っているのである。

さて、日本の住所表記の場合、「◯◯県××市△△町□□丁目」というように記述する。
ここで注目するべきことは、「都道府県」の階層「市町村」の階層
「大字町丁目」の階層の組み合わせで、住所が表記されていること。

実は、パソコンのディレクトリも、基本的には同じように階層的に表現する
ただし、実際の住所と異なることは、階層の深さが未知であり、また、
各階層のディレクトリの数も不明であるという点。これが重要。

ここで、先ほどの例をもう一度確認。各階層はある「区切り文字」で表されている。
すなわち、「」と「」と「丁目」というのが該当する。
パソコンのディレクトリにも、これらに相当する「区切り文字」が存在する。

Windows の場合は「であり、Mac と Linux の場合は「/がその「区切り文字」。
Windows の場合には「ドライブ名」を最初につけて、
c:¥dir1¥dir2¥dir3」といったように表記する。

もちろん、いわゆる「デスクトップ」画面に配置されているファイル類も、
ディレクトリで指定することになる。WindowsMacLinux、のいずれでも同様。
パソコンのあらゆるデータは、ディレクトリ構造によってその位置を特定する

ところで、この「」マークは、欧米の環境では「\(バックスラッシュ)」であり、
場合によっては、このブログでも文字化けする可能性があるため、
本ブログでは、少々、見にくいかもしれなが全角の記号で表すことにする。

さて、ここまでの話を一旦整理し、簡単な図を提示する。
つまりは以下のような階層構造となっているのである。
なお、区切り文字には「/」を使っている。


パソコン上で、ある「フォルダにアクセスする」というのは、言い換えれば、
ある基準となる最上位のディレクトリからの「パス(道筋)」を辿ることである。

このとき、最上位のディレクトリのことを「ルート・ディレクトリ」と呼び、
あるシステムが現在参照中のディレクトリを「カレント・ディレクトリ」と呼ぶ。
この二つの用語は、後々にも登場してくるので、ここで覚えておいた方が良い。

なお、「ルート」は、英語表記では「root」。つまり、「」の意味。
あるディレクトリを指定するということは、
その「根」からの「道筋」を指定することに他ならない。

カレント」に関しては、説明する必要は無いかとも思ったが、一応。
英語では、「current」と表記し、日本語では「現在の」の意味。
意味そのまま。特に、納得することでもない。

さて、色々と話が逸れてしまった。毎度のことか...。

あるディレクトリやファイルを指定することを「パスを通す」と呼び、
パスの通し方には、「絶対パス」と「相対パス」の二種類が存在する。
例えるならば、「住所を国名から書くか?」、「市から書くか?」の違い。

絶対パス」が、ドライブの直下をルートとしたパスの指定方法であり、
相対パス」は、ある既知のディレクトリをルートとしたパスの指定方法である。

絶対パスルート・ディレクトリは、ドライブ直下のディレクトリであり、
この場合のルートディレクトリを包含する上位ディレクトリは存在しない。
また、絶対パスで指定されるディレクトリは、一つしか存在しない

次に「相対パス」の場合。絶対パスの場合、ディレクトリを移動すると、
目的のファイルを参照できなくなるという問題がある。
以下のようなエラーメッセージを見た人は少ないはず。

指定されたファイルがみつかりません。

システムに関わるファイルの場合、問題は深刻。要するに、「相対パス」は、
移動しても良い部分と、移動してはいけない部分を分けるという考え方。
移動先の最上位のディレクトリを指定してやれば通常通りに動くことになる。

この場合のルート・ディレクトリは、移動しても良い部分の最上位のディレクトリ。
最初に、ルート・ディレクトリの場所さえ指定おけば、
システムの処理に深刻な影響は与えない。

さて、ここまでの説明を聞いただけでは、イマイチ、理解しにくいことも多いはず。
ということで、次回は、簡単なプログラムを書きながら
ディレクトリについて理解してみようと思う。

これからの文系は、プログラミングも必要不可欠。折角の機会なのでチャレンジする。
プログラマレベルを目指す必要は無いが、簡単な処理は出来た方が良い。
ということで、次回に向けた準備を。

次回から、プログラミング言語のPython というのを使う。
ダウンロードとインストールは、下記のホームページから。
http://www.python.org/getit/

英語のページではあるが、さすがに、解らない人はいないであろう。
Python 2.7.3」というのが現在の最新バージョン
Python 3.3.0」というのは別ものなので不可

なお、Google検索で「python インストール」などと調べれば、
いくらでも、方法は出てくるので、ここでは説明を省く。
私の説明よりも解りやすいのは、かなり一杯あるだろうし。

基本的な使い方は、本ブログのデータ型の話の所で述べているので、
プログラミングの経験の無い人は、練習も兼ねて、
そこから始めることをお勧めする。