Упрощенная работа с файлами
Упрощенная работа с файлами
Прежде чем рассматривать весьма обширные возможности системы по работе с файлами в целом, отметим упрощенный прием вызова файла с помощью двойного символа «<<»:
<<filename
Эта команда считывает файл с указанным именем filename и заносит в память компьютера содержащиеся в нем определения. Имя файла надо указывать полностью, то есть вместе с расширением. Исключением является случай, когда файл находится в основном каталоге системы. Эта команда эквивалентна функции
Get["filename", key]
Для записи объекта (переменной, массива, списка и т. д.) в файл служат упрощенные команды:
-
expr >> filename — передает значение ехрг в файл с заданным именем;
-
ехрг >>> filename — добавляет ехрг в конец файла с заданным именем.
Указанные команды по существу есть укороченные (и потому более удобные) формы следующих функций:
-
Get ["filename", "key"] — читает файл, который закодирован функцией Encode с использованием ключа "key";
-
GetContext [ "context' " ] — загружает файл с заданным контекстом;
-
Put[exprl, expr2, ..., "filename"] — записывает последовательность выражений expri в файл с именем filename;
-
PutAppend[expr1, expr2, ..., "filename"] — присоединяет последовательность выражений expri к файлу с именем filename.
Еще одна упрощенная функция — ! ! filename — выводит содержимое файла с заданным именем.
Следующие примеры показывают запись списка в файл C:\ma.vat, его считывание, затем добавление в файл еще одного списка и контроль контекста файла:
{{l,2,3},{4,5,6},{a,b,c}}>>C:\ma.val
<<С: \ma. val
{{1, 2, 3}, {4, 5, б), {а, b, с}} {d,e,f}>>>C: \ma.val
<<С: \та. val
{d, e, f}
!!С:\mа.val
1, 2, 3, 4, 5, б, а, b, с d, e, f
Такая форма вызова особенно удобна для вызова файлов пакетов расширений и применений системы. Имя файла указывается по правилам, принятым в MS-DOS. Файлы пакетов применений имеют расширение .т. Мы уже приводили примеры использования определений, содержащихся в файлах пакетов расширения системы.
Имеется еще ряд функций для работы с файлами:
-
ReadList ["filename" ] — читает все оставшиеся в файле "filename" выражения и возвращает их в виде списка;
-
ReadList ["filename", type] — читает из файла "filename" объекты указанного типа type до конца файла. Возвращает список считанных объектов;
-
ReadList ["filename", {typel, type2,...}] — читает объекты указанных типов type1 до конца файла filename;
-
ReadList [ "filename", types, n] — читает только первые п объектов указанных типов types из файла filename;
-
Save ["filename", x1, x2,...] — создает файл с заданным именем filename, содержащий значения переменных x1, х2, ...;
-
! command — исполняет заданную команду операционной системы.
Допустим, что в любом текстовом редакторе создан файл с полным именем C:\datas.txt в ASCII-формате, содержащий просто шесть чисел с разделительными пробелами, размещенные в двух строках и представляющие массив 2x3 элемента:
1 11.2 34.5
2. 3.4 56
Тогда о структуре файла можно судить, используя команду
!!С:\datas.txt
1 1.2 34.5 2. 3.4 56.
Нетрудно заметить, что структура файла соответствует структуре массива. Однако считывание файла командой «name дает следующий результат:
<<С: \datas. txt
380.8
Результат представляет вычисленное выражение второй строки файла. Считывание функцией ReadList без дополнительного аргумента также дает ошибочный результат:
ReadList["С:\datas.txt"]
{41.4, 380.8}
Нетрудно подметить, что функция восприняла каждую строку содержимого файла как результат перемножения трех чисел (пробел на языке Mathematica означает умножение). С дополнительным параметром Number все числа считываются верно:
ReadList["С:\datas.txt", Number]
{1, 1.2, 34.5, 2., 3.4, 56.}
Однако мы получили одномерный список — данные просто считываются построчно. Применение дополнительного параметра в виде {Number, Number} дает следующий результат:
ReadList["С:.txt", {Number, Number}]
{{1, 1.2), {34.5, 2.}, {3.4, 56.}}
Правильный результат можно получить, используя опцию RecordList->True: .
ReadList["C:.txt",Number,RecordLists-XTrue]
{{1, 1.2, 34.5), {2., 3.4, 56.}}
Для загрузки файлов пакетов расширений (Add-On) используются функции, позволяющие задать контекст файлов (подробнее о контекстах речь пойдет в уроке 10):
-
Needs ["context' ", "filename"] — загружает файл, если указанный контекст отсутствует в списке загруженных;
-
Needs [ "context
s
" ] — загружает файл, имя которого определяется с помощью функции ContextToFilename [ "context
ч
" ], если указанный контекст отсутствует в списке загруженных.
Загрузка файлов с указанием их контекстов позволяет избежать конфликтов между разными пакетами расширения, используемыми одновременно (см. более подробно урок 10).