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