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

2 回答 2

1

我建议编写一个函数来打印给定路径名和流的文件。

你用DO. 没关系,但我会使用类似的东西LOOP,它可以让代码更容易阅读。

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

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

您需要调用READ-LINE这样一种方法来测试 EOF 并结束迭代。请参阅 的论点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 回答