file - elisp 中是否有类似 fopen 的功能
问题描述
我知道insert-file-contents
成语:
(defun read-lines (filePath)
(with-temp-buffer
(insert-file-contents filePath)
(split-string (buffer-string) "\n" t)))
但是有没有更自然的方法来逐行读取文件而不一次读取整个文件?我正在寻找fopen
/fread
类似的功能。
解决方案
我认为在 emacs 中处理文件的自然方式是将文件加载到缓冲区中,之后您可以逐行处理它。还可以查看emacs stackexchange 中的这个答案和ergoemacs的这篇博客文章
例如这样:
ELISP> (find-file "foo.txt")
#<buffer foo.txt>
ELISP> (goto-char 1)
1 (#o1, #x1, ?\C-a)
ELISP> (while (not (eobp))
(print (current-line-contents))
(forward-line 1))
为了不获取属性,可以使用函数 thing-at 点:
ELISP> (goto-char 1)
1 (#o1, #x1, ?\C-a)
ELISP> (while (not (eobp))
(print (thing-at-point 'line t))
(forward-line 1))
"line 1
"
"line 2
"
"line 3
"
"line 4
"
nil
如果您出于速度原因需要使用临时缓冲区,请尝试以下操作:
(with-temp-buffer
(insert-file-contents "./foo.txt")
(while (not (eobp))
(print (thing-at-point 'line t))
(forward-line 1)))
推荐阅读
- java - ArrayList.get() 返回空值
- python - Pytorch:TypeError:copy_():参数“其他”(位置1)必须是张量,而不是向量
- r - 从 R 中的数据框中删除一行
- webpack - 在 Quasar SPA 中使用 Service Worker
- azure - CreateIfNotExistsAsync - 此请求无权执行此操作
- javascript - js文件未触发Onload功能
- java - 基于标签的过滤实现 Firestore
- java - 从活动按钮打开片段
- python - OUTPUT_PATH 键和 sys.stdout 在 python 中是否具有相同的功能?
- amazon-redshift - RedShift - 为什么不应该压缩 sortykey 列?