Документация Engee

Импорт и экспорт данных (ввод-вывод)

CSV-файлы

Для чтения и записи табличных данных из CSV и других разделенных текстовых файлов следует использовать пакет CSV.jl.

Если вы раньше не использовали пакет CSV.jl, может понадобиться сначала установить его:

using Pkg
Pkg.add("CSV")

Функции CSV.jl не загружаются автоматически и должны быть импортированы в сеанс.

using CSV

Теперь набор данных можно считать из CSV-файла по пути input, используя

DataFrame(CSV.File(input))

DataFrame можно записать в CSV-файл по пути output, используя

df = DataFrame(x=1, y=2)
CSV.write(output, df)

Поведение функций CSV можно настроить с помощью именованных аргументов. Дополнительные сведения см. в описании ?CSV.File, ?CSV.read, ?CSV.write или в онлайн-документации по CSV.jl.

В простых случаях, когда задержка компиляции CSV.jl может быть проблемой, можно использовать модуль DelimitedFiles из стандартной библиотеки Julia. Далее приведен пример, показывающий, как считывать данные и выполнять их последующую обработку.

julia> using DelimitedFiles, DataFrames

julia> path = joinpath(pkgdir(DataFrames), "docs", "src", "assets", "iris.csv");

julia> data, header = readdlm(path, ',', header=true);

julia> iris_raw = DataFrame(data, vec(header))
150×5 DataFrame
 Row │ SepalLength  SepalWidth  PetalLength  PetalWidth  Species
     │ Any          Any         Any          Any         Any
─────┼──────────────────────────────────────────────────────────────────
   1 │ 5.1          3.5         1.4          0.2         Iris-setosa
   2 │ 4.9          3.0         1.4          0.2         Iris-setosa
   3 │ 4.7          3.2         1.3          0.2         Iris-setosa
   4 │ 4.6          3.1         1.5          0.2         Iris-setosa
   5 │ 5.0          3.6         1.4          0.2         Iris-setosa
   6 │ 5.4          3.9         1.7          0.4         Iris-setosa
   7 │ 4.6          3.4         1.4          0.3         Iris-setosa
   8 │ 5.0          3.4         1.5          0.2         Iris-setosa
  ⋮  │      ⋮           ⋮            ⋮           ⋮             ⋮
 144 │ 6.8          3.2         5.9          2.3         Iris-virginica
 145 │ 6.7          3.3         5.7          2.5         Iris-virginica
 146 │ 6.7          3.0         5.2          2.3         Iris-virginica
 147 │ 6.3          2.5         5.0          1.9         Iris-virginica
 148 │ 6.5          3.0         5.2          2.0         Iris-virginica
 149 │ 6.2          3.4         5.4          2.3         Iris-virginica
 150 │ 5.9          3.0         5.1          1.8         Iris-virginica
                                                        135 rows omitted

julia> iris = identity.(iris_raw)
150×5 DataFrame
 Row │ SepalLength  SepalWidth  PetalLength  PetalWidth  Species
     │ Float64      Float64     Float64      Float64     SubStrin…
─────┼──────────────────────────────────────────────────────────────────
   1 │         5.1         3.5          1.4         0.2  Iris-setosa
   2 │         4.9         3.0          1.4         0.2  Iris-setosa
   3 │         4.7         3.2          1.3         0.2  Iris-setosa
   4 │         4.6         3.1          1.5         0.2  Iris-setosa
   5 │         5.0         3.6          1.4         0.2  Iris-setosa
   6 │         5.4         3.9          1.7         0.4  Iris-setosa
   7 │         4.6         3.4          1.4         0.3  Iris-setosa
   8 │         5.0         3.4          1.5         0.2  Iris-setosa
  ⋮  │      ⋮           ⋮            ⋮           ⋮             ⋮
 144 │         6.8         3.2          5.9         2.3  Iris-virginica
 145 │         6.7         3.3          5.7         2.5  Iris-virginica
 146 │         6.7         3.0          5.2         2.3  Iris-virginica
 147 │         6.3         2.5          5.0         1.9  Iris-virginica
 148 │         6.5         3.0          5.2         2.0  Iris-virginica
 149 │         6.2         3.4          5.4         2.3  Iris-virginica
 150 │         5.9         3.0          5.1         1.8  Iris-virginica
                                                        135 rows omitted

Обратите внимание, что в нашем примере

  • header — это Matrix, поэтому мы должны были передать vec(header) в конструктор DataFrame ;

  • мы транслировали функцию identity через фрейм данных iris_raw, чтобы выполнить сужение eltype столбцов iris_raw. Причина в том, что данные, считанные функцией readdlm, хранятся в data Matrix, поэтому все столбцы в iris_raw изначально имеют одинаковый тип eltype — в данном случае он должен иметь значение Any , поскольку некоторые столбцы являются числовыми, а некоторые — строковыми.

Все эти операции (и многие другие) пакет CSV.jl обрабатывает автоматически.

Аналогично, вы можете использовать функцию writedlm из модуля DelimitedFiles, чтобы сохранить фрейм данных следующим образом:

writedlm("test.csv", Iterators.flatten(([names(iris)], eachrow(iris))), ',')

Как видно, код, необходимый для преобразования iris в нужные входные данные для функции writedlm с целью создания CSV-файла ожидаемого формата, не так прост. Поэтому CSV.jl является предпочтительным пакетом для записи CSV-файлов для данных, хранящихся во фреймах данных.

Другие форматы

Другие форматы данных поддерживаются для чтения и записи в следующих пакетах (список не является исчерпывающим):