Как использовать IOBuffer с файлом, прочитанным в julia1.1.0?

#file #io #julia

#файл #io #джулия

Вопрос:

Я новичок в Julia! Извините меня, если это тривиально или глупо! Я пытаюсь прочитать файл со следующим кодом в readlines.jl:

 #! /opt/julia/julia-1.1.0/bin/Julia
function readlines(file_path::String)
    io = IOBuffer()
    global file
    try
        file = open(file_path)
        l0 = readline(file)
        for line in eachline(file)
           println(io, line)
        end
    catch err
        println("Error: $err")
    finally
        close(file)
    end
end
readlines("/opt/julia/julia-1.1.0/LICENSE.md")
  

при выполнении $/home/julia/readlines.jl содержимое файла не печатается.

Пожалуйста, помогите мне в использовании IOBuffer при чтении файлов!

Ответ №1:

Проблема в вашем коде в том, что вы не возвращаете io из функции. Вот исправление с некоторой очисткой кода (в частности, обратите внимание, что readlines функция определена в Base, поэтому лучше использовать другое имя функции):

 function readlines2(file_path::String)
    io = IOBuffer()
    open(file_path) do file
        l0 = readline(file)
        for line in eachline(file)
            println(io, line)
        end
    end
    io
end
  

Теперь вы можете запустить его, чтобы получить IOBuffer в качестве возвращаемого значения. Обратите внимание, что обычно вы захотите преобразовать содержимое этого IOBuffer в строку, вы можете сделать это с помощью take! и String функций, подобных этой:

 io = readlines2("your_file.ext")
str = String(take!(io))
  

Теперь str содержит данные для чтения в виде строки.

Наконец, вы можете предпочесть использовать встроенную readlines функцию и просто удалить первую запись возвращаемого вектора, а затем join остальные значения следующим образом:

 join(readlines("your_file.ext", keep=true)[2:end])
  

чтобы получить идентичный результат (это, вероятно, немного медленнее, но проще).