BETA

Nimでのファイル列挙

投稿日:2018-12-08
最終更新:2018-12-12

この記事は何?

概要

  • Nimでは、処理を繰り返したり、何かを列挙する時、iteratorを使うのがありがち。
  • 例えば、itrという名前のiteratorがあり、そのiteratorが返す値を全て表示する場合、以下のように書ける。
for i in itr:  
  echo i    
  • この場合、iの型はiteratorによって異なる。
  • ファイルを列挙する時、os moduleにある以下のiteratorを使うのがありがち。
    • walkPattern
    • walkFiles
    • walkDirs
    • walkDir
    • walkDirRec
  • 上記iteratorを使った書き方の実例を示す。
  • また、上記iteratorを用いたファイル列挙時に一緒に使いそうな処理も示す。

再帰的にパスを列挙

カレントディレクトリ以下のファイル

import os  
for f in walkDirRec("."):  
  echo f  
  • walkDirRecは、引数によっていろいろ動作を変えられる。onlineマニュアルの該当箇所はこちら
  • 第1引数に対象とするパスを指定し、それ以外の引数を省略した場合、実体のあるファイルの列挙となる。
  • ディレクトリは列挙しない。また、シンボリックリンクが指すファイルも列挙しない。
  • fstring
  • osモジュールのonlineドキュメントはこちら
  • onlineドキュメントに、関数ごとのソースファイルの定義箇所へのリンクがある。ドキュメントの記述がよくわからん時はソースを見る方が早い場合が(多々)ある。
  • Wandboxでの実行結果
./prog  
./prog.nim  
./.cache/nim/prog_d/stdlib_os.c  
(以下略)  

カレントディレクトリ以下のディレクトリ

import os  
for f in walkDirRec(".", yieldFilter = {pcDir}):  
  echo f  
  • walkDirRecyiedFilterという引数に{pcDir}を指定すると、実体があるディレクトリだけの列挙になる。
  • ファイルは列挙しない。また、シンボリックリンクが指すディレクトリも列挙しない。
  • Wandboxでの実行結果
./.cache  
./.cache/nim  
./.cache/nim/prog_d  

カレントディレクトリ以下のファイルとディレクトリ

import os  
for f in walkDirRec(".", yieldFilter = {pcFile, pcDir}):  
  echo f  
  • walkDirRecyiedFilter引数に{pcFile, pcDir}を指定すると、実体があるファイルまたはディレクトリの列挙になる。
  • シンボリックリンクが指すファイルは列挙しない。また、シンボリックリンクが指すディレクトリも列挙しない。
  • yiedFilter引数のデフォルトが{pcFile}になっているため、yiedFilter引数に何も指定しなかった場合は実体のあるファイルだけの列挙になっていた。
  • Wandboxでの実行結果
./prog  
./prog.nim  
./.cache  
./.cache/nim  
./.cache/nim/prog_d  
./.cache/nim/prog_d/stdlib_os.c  
./.cache/nim/prog_d/stdlib_algorithm.c  
./.cache/nim/prog_d/stdlib_bitops.c  
(以下、略)  

再帰しないでワイルドカードに合致するパスを列挙

カレントディレクトリのファイル

import os  
for f in walkFiles("./*"):  
  echo f  
  • 引数でファイル名のパターンを指定できる。
  • パターンの指定がどう効くかはOS依存。
  • Wandboxでの実行結果
./prog  
./prog.nim  

カレントディレクトリのディレクトリ

import os  
for f in walkDirs("./.*"):  
  echo f  
./.  
./..  
./.cache  

カレントディレクトリのファイルとディレクトリ

import os  
for f in walkPattern("./*"):  
  echo f  

echo "---"  

for f in walkPattern("./*.nim"):  
  echo f  

echo "---"  

for f in walkPattern("./.*"):  
  echo f  
./prog  
./prog.nim  
---  
./prog.nim  
---  
./.  
./..  
./.cache  

再帰しないで種類とパスを列挙

カレントディレクトリ

import os  
for k, f in walkDir("./"):  
  echo k, " ", f  
  • 上記例で、kは種類を示す列挙型、fはパスを示すstring
  • Wandboxでの実行結果
pcFile ./prog  
pcFile ./prog.nim  
pcDir ./.cache  

その他、使用頻度高そうな処理

カレントディレクトリを取得

import os  
echo getCurrentDir()  
  • getCurrentDir()stringを返す。
  • Wandboxでの実行結果
/home/jail  

ファイルパスを、ディレクトリ、ファイル名、拡張子に分解

import ospaths  
var (dir, name, ext) = splitFile("/home/jail/proc.nim")  
echo dir  
echo name  
echo ext  
  • 上記例で、dir, name, extstring
  • ospathsモジュールのonlineドキュメントはこちら
  • Wandboxでの実行結果
/home/jail  
proc  
.nim  

親ディレクトリ名を取得

import ospaths  
echo parentDir("/home/jail/.cache/")  
/home/jail  

パスを連結

import ospaths  
echo joinPath("/home","jail",".cache")   
echo joinPath("/home","jail/",".cache")   
echo joinPath("/home","jail/","/.cache")   
echo joinPath("home","jail",".cache")   
/home/jail/.cache  
/home/jail/.cache  
/home/jail/.cache  
home/jail/.cache  

補足

  • Nimでiteratorやprocなど呼び出す時、第1引数を前に出す構文もある。
  • 例えば、以下は、同じ結果になる。
# Command invocation syntax(コマンド呼び出し構文)  
import os  
for f in walkDirRec("."):   
  echo f  
# Method call syntax(メソッド呼び出し構文)  
import os  
for f in ".".walkDirRec():  
  echo f  
  • onlineドキュメントでは、一貫してCommand invocation syntaxで記述しているが、コード上はどっちで書いても良い。実際、標準ライブラリでもどちらの記述もあるし。
  • 本記事では、一貫してCommand invocation syntaxで記述した。
  • 明日、9日目は、mkanenobuさんのNimで地味に便利な関数とか
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@ishidakeiの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!