2012/12/26

文系のための「ファイル」(2)

コンピュータ上の様々なファイルをダブルクリックを押すとどうなるか?
ひょっとしたら、最適なソフトウェアが無いなどと言われるかもしれないが、
大抵の場合は、そのファイルに最適なソフトウェアが起動する

当たり前のことであるが、ダブルクリックという操作が行われた瞬間に、
コンピュータは、そのファイルの「種類に最適なプログラムを検出し、
検出した種類に適したなプログラムを起動するように命令している。

つまり、ファイルには、何らかのファイルの種類を特定する情報があって、
コンピュータは、仕組み上、その種類を識別できる…ハズである。
今回の話は、コンピュータがどのようにしてファイルの種類を特定するか?という話。

結論から言うと、ファイルの種類は「拡張子」と呼ばれるものによって判別される。
前回の話では、FATというファイルシステムの所で少し話をした。
8.3形式では、8文字のファイル名と3文字の拡張子が云々…とか。

どういうことか?とりあえず、8文字のファイル名と3文字の拡張子の例を挙げる。

abcdefg.txt

この場合、「abcdefg」の部分が「ファイル名」であり、
.」を挟んで「txt」の部分が「拡張子」と呼ばれる部分である。
知っている人が見れば、上のファイルがメモ帳で開けるテキストファイルだと解る。

同様に、知っている人が見れば以下のファイルの種類を知ることは極めて簡単。
  • untitle.doc
  • untitle.jpg
  • untitle.mp3
この三種類のファイルの種類は一番上から順に、
Wordの文書データJPEG形式と呼ばれる画像データMP3と呼ばれる音声データ
ということが解る。これらは、ファイル名の後ろに付与されている拡張子で判別できる

ここまでに挙げた例は、8.3形式というのは、昔のFATでの規則の場合。
したがって、他のファイルシステムでは、3文字以外の拡張子を使うこともあるし、
拡張子を複数付けることもある。
  • untitle.JPEG
  • untitle.py
  • untitle.tar.gz
これらは、JPEG形式のファイル、Pythonのファイル、そして、最後のファイルは、
複数のファイルをまとめてtar)、GZIPという方法で圧縮したgz)ファイル。
なお、現在では、ファイル名の文字数制限に関しては気にする必要は無いだろう。

さて、拡張子は、要するに、ファイル名の後ろに「.」を挟んで付加する文字列で、
その文字列によって、ファイルの種類を特定するためのものである。
この仕組みによって、コンピュータはファイルの種類を特定しているのである。

ところで、このブログの読者の中には、自分のコンピュータの環境上
拡張子が表示されていない可能性があるが、その設定方法は、
例えば、「Windows7 拡張子 表示」などとGoogleで検索すると出てくるハズ。

Mac OS XUbuntu も同様に、検索すると出てくるので各自設定方法を検索して確認を
OSやバージョンごとに、設定方法が異なるので、このブログでは詳しくは書かない。
不親切かもしれないが、このブログよりも親切な説明を見た方が良いだろう。

少々、話が逸れたが、拡張子については、セキュリティ上のこともあって、
ちゃんと理解した方が良い。というのは、拡張子は「偽装」できるからである。
この「偽装」というのを使って、コンピュータウイルスをばら撒く連中がいる。

例えば、Windows の場合、直接実行できるファイルの拡張子は「.exe」である。
要するに、「execution(執行)」の略。一般的なソフトウェアの拡張子も「exe」。
拡張子が見えない設定の場合、以下のように拡張子を偽装することができる。
  • I_LOVE_YOU.txt.exe
一般的に、複数の拡張子が並んでいる場合、最後の「.」から後ろを拡張子とする。
Windows などで、拡張子が非表示になっている場合には、最後の拡張子が省かれる。
したがって、このファイルの拡張子は、以下のように見えてしまう。
  • I_LOVE_YOU.txt
これを単なるテキストファイルであり誰かからのラブレターである、と勘違いし、
ウハウハ気分でダブルクリックすると、このファイルが実行されてしまい、
結果としてウイルスに感染する...

この事件、実際に過去に起きた事件2000年ごろに世界中で話題になった。
なお、実際の拡張子は「exe」では無く、「vbs」という拡張子であったが、
この拡張子を持つファイル直接実行が可能で、多くの人が被害にあった。

ちなみに、私は騙されなかったが...騙された人は周囲にもいた。

本来は、拡張子のことを知らない人が勝手に書き換えて、
ファイルが適切に開けないようにするために拡張子を表示しないようになっているが、
このブログの読者には、拡張子を表示しておくことを強く推奨する。

拡張子の偽装は、悪意があっての偽装とは限らない
例えば、最近のワードファイルの拡張子は「.docx」である。
実は、このファイルZIPという形式で圧縮されたファイルである。

したがって、このファイル拡張子を「.zip」に変更すると...。
普通に、このファイルを開くことができる。
危険なので、そのようなことはしてはいけないが、実験してみると良い。

さてさて、ここからは、Pythonを使って、拡張子を扱ってみる。
この方法も、自分でプログラムを作る時に役立つ。
とりあえず、Pythonコンソールを立ち上げる。

以下は、ディレクトリの話の所で使ったコードを修正したもの。
とりあえず、自分のホームディレクトリを設定して実行。
意味が解らない人は、前の話に戻って復習。


import os

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

for path in os.listdir(home):
    fullpath = os.path.join(home, path)
    if os.path.isdir(fullpath) == False:
        filename, extension = os.path.splitext(path)
            print("nam:"+filename)
            print("ext:"+extension)

前回の話の時には、ディレクトリを取得するのが目的だったが、
今回は、ファイル名拡張子を取得したいため、「if os.path.isdir(fullpath) == False:」。
つまり、fullpath に格納されたパスがディレクトリ名では「無い」場合

この処理で、最終的にコンソールに表示されるのは、printと書かれている部分の中身
nam:○○○○」という表示と「ext:××××」というのが交互に表示されるはず。
このプログラムで重要な部分は、print の命令の直前の部分。

つまり、「filename, extension = os.path.splitext(path)」と書かれた部分。
この部分では、「os」というパッケージに含まれる「path」というパッケージの中の、
splitext() という機能を呼び出し、「filename」と「extension」に同時に結果を格納している。

これを応用すると、特定のファイルのみを取得することができる
例えば、テキストファイルのみを取り出したい場合には、以下のようにする。

import os

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

for path in os.listdir(home):
    fullpath = os.path.join(home, path)
    if os.path.isdir(fullpath) == False:
        filename, extension = os.path.splitext(path)
        if extension == ".txt":
            print(fullpath)

if extension == ".txt":」という部分は、「もしも、拡張子が”.txt”ならば:」という分岐。
この結果が満たされた場合にのみ「print(fullpath)」が実行され、絶対パスが表示される。
ここで、JPEG画像を表示したい場合には、「.txt」の部分を「.jpg」に変えれば良い。

0 件のコメント:

コメントを投稿