获取目录中的文件,按行打印

时间:2012-05-05 08:06:53

标签: lisp common-lisp

我将部分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))))

2 个答案:

答案 0 :(得分:1)

我建议编写一个函数,在给定路径名和流的情况下打印文件。

您使用DO进行迭代。没关系,但是我会使用类似LOOP的东西,这样可以更容易阅读代码。

你的DO是一个无限循环。您可能希望在达到EOF时结束循环。

READ-LINE在读取文件末尾时会生成错误。因此,您的代码在第一个文件的末尾发出错误信号。此错误导致您的代码仅打印第一个文件。

您需要调用READ-LINE这样的方式来测试EOF并结束迭代。查看READ-LINE的参数。或者,您可以捕获EOF错误,但另一种解决方案稍微容易一些。

答案 1 :(得分: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))))