Потоки и файлы. Упрощенная работа с файлами.
Допустим, что в любом текстовом редакторе создан файл с полным именем C:\datas.txt в ASCII-формате, содержащий просто шесть чисел с разделительными пробелами, размещенные в двух строках и представляющие массив 2x3 элемента:
1
11.2
34.5
2
.
3.4
56
Тогда о структуре файла можно судить, используя команду:
!!C:\datas.txt
1
1.2
34.5
2.3.4
56
.
Нетрудно заметить, что структура файла соответствует структуре массива. Однако считывание файла командой "name" дает следующий результат:
<
<
C:\datas.txt
380.8
Результат представляет вычисленное выражение второй строки файла. Считывание функцией ReadList без дополнительного аргумента также дает ошибочный результат:
ReadList[
"C:\datas.txt"
]
{
41.4
,
380.8
}
Нетрудно подметить, что функция восприняла каждую строку содержимого файла как результат перемножения трех чисел (пробел на языке Mathematica означает умножение). С дополнительным параметром Number все числа считываются верно:
ReadList[
"C:\datas.txt"
, Number]
{
1
,
1.2
,
34.5
,
2
.,
3.4
,
56
.}
Однако мы получили одномерный список – данные просто считываются построчно. Применение дополнительного параметра в виде {Number, Number} дает следующий результат:
ReadList[
"C:.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 ["contexts "] – загружает файл, имя которого определяется с помощью функции ContextToFilename ["contexts "], если указанный контекст отсутствует в списке загруженных.
Загрузка файлов с указанием их контекстов позволяет избежать конфликтов между разными пакетами расширения, используемыми одновременно (см. более подробно урок 10).