我有以下文件 data.txt
A
B
C
D
Run Code Online (Sandbox Code Playgroud)
我想把这个文件的内容读成一个Lisp list
,比如
(defun read-list-from-file (fn)
(interactive)
(list "A" "B" "C" "D"))
(defun my-read ()
(interactive)
(let (( mylist (read-list-from-file "data.txt")))
(print mylist t)))
Run Code Online (Sandbox Code Playgroud)
我如何修改read-list-from-file
它返回相同的列表,而是从作为输入参数给出的文件中读取.文件中的fn
每一行应该是列表中的单独项目.
这段代码:
(with-current-buffer
(find-file-noselect "~/data.txt")
(split-string
(save-restriction
(widen)
(buffer-substring-no-properties
(point-min)
(point-max)))
"\n" t))
Run Code Online (Sandbox Code Playgroud)
这是一个版本insert-file-contents
:
(defun slurp (f)
(with-temp-buffer
(insert-file-contents f)
(buffer-substring-no-properties
(point-min)
(point-max))))
(split-string
(slurp "~/data.txt") "\n" t)
Run Code Online (Sandbox Code Playgroud)
比创建临时缓冲区更容易使用f
文件操作库的f-read
函数来返回文件的文本内容(默认编码为UTF-8).
f
是您需要从MELPA安装的第三方,阅读Xah Lee关于如何使用Emacs包管理系统的教程.然后你可以使用split-string
或者s
字符串操作库s-split
(这是前一个函数的简单包装):
(s-split "\n" (f-read "~/data.txt") t) ; ("A" "B" "C" "D")
Run Code Online (Sandbox Code Playgroud)
注意:要s-split
设置的第三个参数t
省略空字符串.您可以使用s-lines
,但由于*nix系统上的文本文件通常包含尾随换行符,因此返回的列表将是("A" "B" "C" "D" "")
.您可以使用dash
列表操作库的butlast
函数删除最后一个元素,但这适用于O(n),因此可能坚持s-split
,除非您希望在列表中保留空行.