Engee 文档

输入/输出功能

Julia 中的输入/输出功能提供了处理文件、数据流和其他数据源/接收器的能力(见I/O and Network )。对于导入文件浏览器的文件,可以应用函数:

发现

open - 打开文件或数据流。

Details

open "函数可以方便安全地处理文件,因为在 "open "调用的上下文中使用文件后,文件会自动关闭,这有助于避免资源泄漏或其他与隐式保留打开文件相关的问题。

该函数将 f 函数应用于结果 open(args...; kwargs...) 并在完成后关闭结果文件描述符。

open(f::Function, args...; kwargs...)

文件描述符是一个抽象概念,用于在程序中表示打开的文件。它是一种数据结构,包含文件的相关信息,如文件路径、访问模式(读、写等)、当前在文件中的位置以及其他属性。例如

write("my_file.txt", "Hello world!"); #создается файл my_file.txt, содержащий текст Hello world!

open(io->read(io, String), "my_file.txt")
"Hello world!" #открывает my_file.txt для чтения и сразу же читает его содержимое в строку

rm("my_file.txt") #удаляет my_file.txt после того, как его содержимое было прочитано и выведено

io->read(io, String) 函数接收 I/O 对象 (io),并将其内容读入字符串。然后将文件 "my_file.txt "的内容作为结果输出,最终结果是字符串 "Hello world!"。


以五个逻辑参数指定的模式打开文件:

open(filename::AbstractString; lock = true, keywords...) -> IOStream

关键字

描述

默认。

读取

创建
截断
添加

打开阅读
写入
如果不存在,则创建
修剪为零
搜索到底


Truncate`| append
读写`| 截断| `append
读写

默认情况下,如果没有传递关键字,文件将以只读方式打开。会返回一个线程来访问打开的文件。名为 lock 的参数指定是否锁定操作,以确保多线程访问的安全性。

另一种打开语法使用基于字符串操作的模式描述符,而不是五个逻辑参数。模式值与 fopen(3)Perl open 中的模式值相对应,并且 相当于设置以下逻辑组:

模式

描述

关键字

r
w
r+
w+
a+

阅读
读取、创建、修剪
读取、创建、连接
阅读、书写
读、写、创建、修剪
读、写、创建、连接

不 写入 = true
添加 = true
读取 = true,写入 = true
截断 = true, 读 = true
append = true, read = tru

*示例:

io = open("my_file.txt", "w"); #открывает my_file.txt для записи (write)

write(io, "Hello world!"); #записывает строку Hello world! в файл, который был открыт для записи в предыдущей строке

close(io); #закрывает my_file.txt, освобождая ресурсы и завершая операцию записи

io = open("my_file.txt", "r"); #открывает my_file.txt для чтения (read), возвращает объект ввода/вывода (io)

read(io, String) #читает содержимое файла my_file.txt как строку
"Hello world!" #результат операции

write(io, "This file is read only") #поскольку файл был открыт только для чтения (в предыдущей строке), эта операция записи не разрешена и выдаст ошибку ArgumentError
ERROR: ArgumentError: write failed, IOStream is not writeable
[...]

close(io) #закрывает файл my_file.txt после попытки записи, чтобы освободить ресурсы

io = open("myfile.txt", "a"); #открывает my_file.txt для добавления (append), что позволит записывать данные в конец файла без удаления или перезаписи его содержимого

write(io, "This stream is not read only") #записывает строку "This stream is not read only" в конец файла my_file.txt, так как файл был открыт в режиме добавления ("a"). Функция write возвращает количество записанных байтов (28)
28 #результат операции

close(io)#закрывает my_file.txt после выполнения всех операций записи, чтобы освободить ресурсы

rm("my_file.txt") #удаляет файл my_file.txt

阅读更多有关I/O and Networkopen 函数所有功能的信息。

isopen - 判断对象(线程或计时器)是否已经关闭。

Details

对象一旦关闭,就不能再创建新事件。不过,鉴于已关闭的线程可能仍有数据要在缓冲区中读取,因此应使用 eof 来检查数据是否可以读取。使用 FileWatching 软件包可在支持向流写入或从流读取数据时收到通知。如果对象处于打开状态,函数将输出 true;如果对象处于关闭状态,函数将输出 false

io = open("my_file.txt", "w+"); #открывает файл my_file.txt в режиме "w+" (записи и чтения)

isopen(io) #проверяет, открыт ли файл, связанный с объектом ввода/вывода io (my_file.txt)
true #результат операции

close(io) #закрывает файл, связанный с объектом ввода/вывода io, после закрытия файл больше не доступен для записи или чтения

isopen(io) #после того как файл был закрыт (предыдущая операция), команда возвращает false, потому что файл уже не открыт
false #результат операции

对于函数 io = open("my_file.txt", "w+")

  • 如果文件不存在,将创建该文件。

  • 如果文件已经存在,将删除其内容。

函数 open 还会返回一个与打开的文件相关联的 I/O 对象 (io)

关闭

close - 关闭 I/O 流。

Details

首先执行`flush`(强制重置 I/O)。

close(io)

closeall - 关闭图形用户界面上所有打开的窗口。

Details

如果你想在终止程序前确保所有文件都已关闭,那么它将非常有用。

closeall()

closeread - 仅关闭与 I/O 对象关联的文件读取线程。

Details

如果文件已打开供读写,则写入流仍保持打开。仅用于关闭读取流,但可以选择继续向文件写入。

closeread(io)

closewrite - 停止写入全双工 I/O 流的一半。

Details

首先执行`flush`操作。通知对方数据不再写入基础文件。某些 I/O 类型可能不支持此操作。

*示例

io = Base.BufferStream(); #создается новый буферизованный поток ввода/вывода. В этом случае блокировка никогда не выполняется, поэтому операции чтения и записи доступны для того же задания

write(io, "request"); #строка request записывается в буферизованный поток io

# при вызове здесь `read(io)` применяется постоянная блокировка

closewrite(io); #закрывается поток записи в io и не будут приниматься операции записи, при этом поток чтения остается открытым

read(io, String) #выполняется операция чтения из io

录音

write - 将数值的规范二进制文件表示写入指定的 I/O 流或文件。

Details

返回写入数据流的字节数。写入值的字节顺序取决于主机系统中的字节顺序。

一次写入调用可以写入多个值,即以下值是等价的:

write(io, x, y...)
write(io, x) + write(io, y...)

例如

#Согласованная сериализация

fname = tempname(); # произвольное временное имя файла

open(fname,"w") do f
             # Убедиться в том, что выполняется запись 64-разрядного целочисленного значения в формате прямого порядка следования байтов
             write(f,htol(Int64(42)))
         end
8

julia> open(fname,"r") do f
             # Выполнить обратное преобразование в основной порядок следования байтов и основной целочисленный тип
             Int(ltoh(read(f,Int64)))
         end
42

#Объединение вызовов операций записи:

io = IOBuffer();

write(io, "JuliaLang is a GitHub organization.", " It has many members.")
56

String(take!(io))
"JuliaLang is a GitHub organization. It has many members."

write(io, "Sometimes those members") + write(io, " write documentation.")
44

String(take!(io))
"Sometimes those members write documentation."

#Определяемые пользователем типы основных данных без методов write можно записать, а заметим инапсулировать в Ref

struct MyStruct; x::Float64; end

io = IOBuffer()
IOBuffer(data=UInt8[...], readable=true, writable=true, seekable=true, append=false, size=0, maxsize=Inf, ptr=1, mark=-1)

write(io, Ref(MyStruct(42.0)))
8

seekstart(io); read!(io, Ref(MyStruct(NaN)))
Base.RefValue{MyStruct}(MyStruct(42.0))

iswritable - 检查是否支持写入指定对象。

Details

如果不支持写入指定的 I/O 对象,则返回 false

*`示例

open("my_file.txt", "w") do io
    print(io, "Hello world!");
    iswritable(io)
end
true

open("my_file.txt", "r") do io
    iswritable(io)
end
false

rm("my_file.txt")

阅读

read - 执行文件内容的读取。

Details

默认情况下,`read`以二进制模式读取文件:

read("sample1.json")

#вывод
65-element Vector{UInt8}:
 0x7b
 0x0a
 0x20
 0x20
 0x20
    ⋮

为避免表示为字节数组,建议使用表示参数。例如,"read "函数可以接受多个参数,包括文件内容应转换成的数据类型(我们使用 String):

read("sample1.json", String) #считывает содержимое файла sample1.json и возвращает его в виде строки

#вывод
"{\n    \"fruit\": \"Apple\",\n    \"size\": \"Large\",\n    \"color\": \"Red\"\n}"

您可以使用 Char 参数从文件中读取第一个字符,并以 Char 格式(字符类型)返回:

read("sample1.json", Char)

#вывод
'{': ASCII/Unicode U+007B (category Ps: Punctuation, open)

该函数 read(file_name::IOStream, number_of_bytes::Integer) 最多从文件流 file_name 中读取 number_of_bytes 字节,并返回包含读取字节的数组 Vector{ UInt8 }。要从文件获取数据流,必须打开文件供读取。例如

open("sample1.json", "r") #открываем файл для чтения

#вывод результата чтения
IOStream(<file sample1.json>)

read("sample1.json", 10) #читаем первые 10 байтов из файла

#вывод
10-element Vector{UInt8}:
 0x7b
 0x0a
 0x20
 0x20
 0x20
 0x20
 0x22
 0x66
 0x72
 0x75
*数据流是一种数据抽象,代表字节序列。序列可以从数据源读出或写入,也可以写入数据源。例如,文本文件、网络连接、内存等。数据流还可用于从数据源读取数据(输入)或向数据源写入数据(输出)。使用:
  • flush - 将当前缓冲区中的所有记录提交到该数据流。

  • close(stream)` - 关闭 I/O 流。优先执行 flush

  • closewrite(steam)` - 禁用全双工流的半写入。优先执行 flush。将不再向基础文件写入数据。并非所有 I/O 类型都支持此功能。

你可以使用 read 函数执行 cmd 命令。例如,让我们创建 date 命令(输出当前日期和时间):

#создаем команду, которая выводит текущую дату и время
cmd = `date`

read(cmd) #выводит результат как массив байтов

read(cmd, String) #выводит результат как строку
#вывод
"Thu Mar 28 07:44:58 UTC 2024\n"

read! - 从 I/O 流或文件中读取二进制数据,填充数据矩阵。

Details

read!"函数用于将数据从 I/O 流或文件读入预先分配的缓冲区或数组。它通常用于有效地用外部数据填充数组,而无需创建额外的临时数组。要从文件中获取数据流,必须打开文件供读取。例如

open("sample1.json", "r") #открываем файл для чтения

my_array = zeros(UInt8, 5) #создается массив из 5 элементов типа UInt8 заполненный нулями
#вывод
5-element Vector{UInt8}:
 0x00
 0x00
 0x00
 0x00
 0x00

read!("sample1.json", my_array) #считывает данные из sample1.json и заполняет ими массив my_array
#вывод
5-element Vector{UInt8}:
 0x7b
 0x0a
 0x20
 0x20
 0x20

readavailable - 从数据流中读取可用的缓冲数据。

Details

如果数据流中有尚未读取的数据,函数将返回该数据。只有在数据尚未缓冲的情况下,才会执行实际 I/O。如果缓冲区中没有数据,函数将返回一个空字节数组。

返回的数据量与实现有关,例如,可能取决于缓冲区大小的内部选择。通常应使用其他函数(如 read)来代替。
IOS=open("sample1.json", "r") #открывает файл в режиме чтения и записывает его в содержимое буфер ввода/вывода IOS

readavailable(IOS) #считывает доступные данные из буфера ввода/вывода и возвращает их

readbytes! - 从 stream 到 b 执行最多 nb 字节的读取,返回读取的字节数。

Details

函数 readbytes! 从数据流中最多读取 n 个字节并将它们写入数据数组。如果未指定 n 字节,则会读取与数组长度相等的字节数。然后返回读取的字节数。如果数据流中可用的字节数少于请求的字节数,则只读取可用的字节数。

IOS=open("sample1.json", "r") #открывает файл в режиме чтения и записывает его в содержимое буфер ввода/вывода IOS

buffer = Vector{UInt8}(undef, 5) #создается пустой массив buffer типа UInt8 длиной в 5 элементов

readbytes!(IOS, buffer) #считывает 5 байт из потока IOS и сохраняет их в массив buffer

#вывод
5 #в итоге выводится число, которое указывает на количество успешно считанных байтов. Поскольку массив состоял из 5 элементов - он полностью успешно считан

readchomp - 以一行为单位读取完整文件,并删除文件末尾的一个换行符(如果有)。

Details

readchomp` 函数等价于 chomp(read(x,String))

write("my_file.txt", "Добро пожаловать в Engee.\n");

readchomp("my_file.txt")

#вывод
"Добро пожаловать в Engee."

readdir - 返回目录(dir)中的名称,如果未指定,则返回当前工作目录。

Details

readdir 函数用于读取一个目录的内容。它返回一个字符串数组,每个字符串代表指定目录中文件或子目录的名称。

默认情况下,readdir 会对返回的名称列表进行排序。若要跳过名称排序,按照文件系统中列出的顺序获取名称,可以使用 readdir(dir,sort=false)

cd("/user") #переход на стартовую директорию user

readdir() #возвращает имена всех файлов в текущей директории (сейчас - "/user")
7-element Vector{String}:
 ".git"
 ".packages"
 ".project"
 "11.ngscript"
 "engee_commands.csv"
 "my_file.txt"
 "sample1.json"

readdir(join=true) #объединение возвращаемого имени с текущей директорией
7-element Vector{String}:
 "/user/.git"
 "/user/.packages"
 "/user/.project"
 "/user/11.ngscript"
 "/user/engee_commands.csv"
 "/user/my_file.txt"
 "/user/sample1.json"

readdir("my_dir") #возвращает имена всех файлов в каталоге my_dir
7-element Vector{String}:
 "RTFM-HISTORY.txt"
 "delay.html"
 "difference.pdf"
 "difference.xml"
 "littleendian.svg"
 "markdown_test.md"
 "mat.mat"

readdir("my_dir", join=true) #объединение возвращаемого имени с выбранной директорией (my_dir)
7-element Vector{String}:
 "my_dir/RTFM-HISTORY.txt"
 "my_dir/delay.html"
 "my_dir/difference.pdf"
 "my_dir/difference.xml"
 "my_dir/littleendian.svg"
 "my_dir/markdown_test.md"
 "my_dir/mat.mat"

readeach - 返回结果为 read(io, T) 的迭代对象。

Details

readeach "函数用于遍历文件或数据流的内容,对每一行或每一条数据执行指定的操作。该函数的输入是要读取的流,以及要应用于每一行或每一条数据的参数。

io = IOBuffer("Добро пожаловать в Engee.\n Текст, который будет удален функцией.\n") #создается буфер ввода/вывода

for c in readeach(io, Char) #итерация по символам из потока до тех пор, пока не достигнет \n, после завершает итерацию
             c == '\n' && break
             print(c)
         end

#вывод
Добро пожаловать в Engee.

readline - 从给定的 I/O 流或文件中读取一行文本。

Details

从文件读取时,假定文本使用的是 UTF-8 编码。输入行以"\n "或"\r\n "结束,或以输入流结束。也可以使用 keep 参数。如果 keep 设置为 false(默认值),在返回字符串之前,这些换行结束符会被从字符串中删除。如果 keep 的值为 true,它们将作为字符串的一部分返回。

write("my_file.txt", "Добро пожаловать в Engee.\nТекст, который будет удален функцией.\n");

readline("my_file.txt")
"Добро пожаловать в Engee."

readline("my_file.txt", keep=true)
"Добро пожаловать в Engee.\n"

rm("my_file.txt") #удаляет файл my_file.txt

print("Enter your name: ")

your_name = readline() #откроет окно ввода имени пользователя
#введем имя, например Engee_User
"Engee_User"

readlines - 以向量或字符串的形式读取 I/O 流或文件中的所有行。

Details

其行为类似于重复保存使用相同参数读取 readline 的结果,并将读取的行保存为向量或字符串值。

write("my_file.txt", "Добро пожаловать в Engee.\nТекст, который НЕ будет удален функцией.\n");

readlines("my_file.txt")
#вывод
2-element Vector{String}:
 "Добро пожаловать в Engee."
 "Текст, который НЕ будет удален функцией."

readlines("my_file.txt", keep=true)
2-element Vector{String}:
 "Добро пожаловать в Engee.\n"
 "Текст, который НЕ будет удален функцией.\n"

rm("my_file.txt") #удаляет файл my_file.txt

readuntil - 从 I/O 流或文件中读取字符串(直到指定的分隔符)。

Details

定界符可以是 UInt8、AbstractChar、字符串或向量。命名参数 keep 决定分隔符是否包含在结果中。假定文本使用 UTF-8 编码。

write("my_file.txt", "Добро пожаловать в Engee.\nТекст, который будет удален функцией.\n")

readuntil("my_file.txt", 'L')

readuntil("my_file.txt", '.', keep = true)
  "Добро пожаловать в Engee."

rm("my_file.txt")

有关 Engee 中其他文件管理功能的更多信息,请访问软件控制建模