2012-05-05 8 views
0

私のPythonスクリプトをCommon Lispに移植します。私はいくつかのディレクトリにファイルのリストを取得し、各ファイルの内容を行単位で出力する必要があります。 このコードはすべてのファイル名を表示します。しかし、行は最後のファイルに対してのみ印刷されます。どうして? また、ファイル行ごとに反復する最良の方法は何ですか?おかげさまで ディレクトリ内のファイルを取得し、行ごとに出力します。

(dolist (file (directory (make-pathname :name :wild 
             :type :wild 
             :defaults "path\\to\\files\\"))) 
    (print file) 
    (with-open-file (stream file) 
    (do ((line (read-line stream) (read-line stream))) 
     (nil t) 
     (print line)))) 
+0

私は推測する、それがnilを返すだ、エンド・テスト形式です。 –

+0

NILは常にfalseです。それは永遠に繰り返す。それはあなたが望んだことですか? –

答えて

1

パス名とストリームを指定してファイルを出力する関数を記述することを提案します。

DOで反復処理します。それは大丈夫ですが、私はLOOPのようなものを使用して、コードを少し読みやすくしています。

DOは無限ループです。 EOFに達すると、ループを終了することができます。

READ-LINEは、ファイルの最後を読み取るとエラーが発生します。したがって、コードは最初のファイルの最後にエラーを通知します。このエラーにより、コードは最初のファイルのみを出力します。

READ-LINEを呼び出して、EOFをテストしてから繰り返しを終了する必要があります。引数はREAD-LINEを参照してください。あるいは、EOFエラーをキャッチすることもできますが、もう少し簡単な方法があります。

0

これは私のために働くようだ:

(dolist (file (directory (make-pathname :name :wild 
              :defaults "/tmp/lt/files/"))) 
    (print file) 
    (with-open-file (stream file) 
     (do ((line (read-line stream nil) (read-line stream nil))) 
     ((null line)) 
     (print line)))) 
+0

ありがとう、このコードは動作します! –

関連する問題