6 文件

6.1 文本文件读写

对文本文件, readlines(filename)函数根据输入的文件名读入文件的各行为字符串数组, 每个元素是一行, 缺省行为会读入换行符但结果字符串不包含换行符, 加选项keep=true可以保留换行符。 用read(filename, String)将整个文件读入为一个长字符串。

fh = open(filename)打开指定的文件用于读取, 这里fh称为一个文件句柄。 读取如readline(fh), 缺省行为会读入换行符但结果字符串不包含换行符, 加选项keep=true可以保留换行符。 用close(fh)关闭fh对应的文件。

很大的文件可以每次读入一行进行处理,框架如:

open(filename) do io
    line = readline(io)
    process(line)
end

fh = open(filename, "w")打开指定的文件用于输出, 写入如println(fh, "x = ", x)。 对于字符串s, 也可以用write(fh, s)写入。 结束写入后用close(fh)关闭输出文件。

6.2 文件和目录信息

参考:

文件保存在目录(directory)中。 用pwd()返回当前的工作目录, 不给定具体路径的文件名默认在工作目录中。 用cd(path)设定path为当前工作目录。

因为不同操作系统的文件路径写法不同, 所以尽可能使用Julia的函数来对路径进行操作。 用abspath(filename)求一个文件的绝对路径。 用dirname(filename)求一个文件所在的目录。 用joinpath()将目录与文件连接成一个完整路径。

dirname(path)获取文件路径的目录部分, 用basename(path)获取文件路径除去目录的部分。

可以用dirname(@__FILE__)获取正在运行的源程序文件所在的目录。 设这个源文件同级有一个data子目录, 其中有pat.csv数据文件, 可以用

root = dirname(@__FILE__)
fd = joinpath(root, "data", "pat.csv")

获得文件的全路径,保存在变量fd中。

ispath(filename)判断每个文件或者目录是否存在。 用isdir(filename)判断某个路径是否目录, 用isfile(filename)判断某个路径是否文件。

readdir(path)返回指定目录的文件和子目录列表, 无path时对应当前工作目录。

walkdir(path)提供了对一个目录及其中的子目录遍历的功能, 遍历时提供了当前目录、其中的子目录列表、其中的文件列表。

显示一个目录下的所有文件和子目录的样例程序如下:

for (root, dirs, files) in walkdir(".")
    println("正在显示$(root)内容---子目录:")
    for dir in dirs
        println(joinpath(root, dir)) # path to directories
    end
    println("正在显示$(root)内容---文件:")
    for file in files
        println(joinpath(root, file)) # path to files
    end
end

如果不用内置的walkdir函数, 可以递归调用如下:

function mywalk(dir)
    println("正在显示$(dir)内容:")
    ## 先显示所有文件
    for name in readdir(dir)
        path = joinpath(dir, name)
        if isfile(path)
            println(path)
        end
    end
    ## 再深入每个子目录
    for name in readdir(dir)
        path = joinpath(dir, name)
        if isdir(path)
            mywalk(path)
        end
    end
end

mywalk(".")