0

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

(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))))
4

2 に答える 2

1

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

で繰り返しDOます。それは大丈夫ですが、LOOPコードを少し読みやすくするようなものを使用します。

あなたDOは無限ループです。EOFに達したときにループを終了することをお勧めします。

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

READ-LINEEOFをテストし、反復を終了するような方法を呼び出す必要があります。の引数を参照してくださいREAD-LINE。または、EOFエラーをキャッチすることもできますが、他の解決策の方が少し簡単です。

于 2012-05-05T08:23:33.170 に答える
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))))
于 2012-05-05T08:39:29.297 に答える