gpt4 book ai didi

Clojure:for循环中的缓冲读取器

转载 作者:行者123 更新时间:2023-12-02 14:26:20 25 4
gpt4 key购买 nike

我有一个大文本文件想要在 Clojure 中处理。
我需要一次处理两行。

我决定使用 for 循环,这样我就可以使用以下绑定(bind)为每次传递拉出 2 行(rdr 是我的读者):

[[line-a line-b] (partition 2 (line-seq rdr))]

(我有兴趣了解为每个循环迭代获取 2 行的其他方法,但这不是我的问题的重点)。

当尝试让循环工作时(对这些测试使用更简单的绑定(bind)),我看到以下无法解释的行为:

为什么

(with-open [rdr (reader "path/to/file")]  
(for [line (line-seq rdr)]
line))

触发 Stream 关​​闭异常

同时

(with-open [rdr (reader "path/to/file")]  
(doseq [line (line-seq rdr)]
(println line)))

有效吗?

最佳答案

for 是惰性的,只返回最终从文件中读取数据的序列的头部。 当您的代表打印 for 的内容时,文件已经关闭。您可以修复此 pu 将 for 包装在 doall

(with-open [rdr (reader "path/to/file")]  
(doall (for [line (line-seq rdr)]
line)))

尽管这会解除序列的惰性。

这是我的misc.clj 中的函数示例,该函数在文件末尾延迟关闭文件:

(defn byte-seq [rdr]
"create a lazy seq of bytes in a file and close the file at the end"
(let [result (. rdr read)]
(if (= result -1)
(do (. rdr close) nil)
(lazy-seq (cons result (byte-seq rdr))))))

关于Clojure:for循环中的缓冲读取器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11997191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com