Что такое синтаксис файла
После окончания работы программы и вывода результатов на дисплей данные будут утрачены безвозвратно, если они не будут записаны и сохранены в долговременной памяти. Для сохранения данных в долговременной памяти используются файлы. Файл (англ. file) — это именованная область памяти на носителе информации. В программировании различают два типа файлов: текстовые и двоичные (бинарные). Вне зависимости от организации данных в файлах, данные в них представлены в двоичном формате, так что это деление условное.
Ниже рассматривается работа только с текстовыми файлами. В текстовых файлах данные интерпретируются как последовательность символьных кодов. Это позволяет отвлечься от двоичного представления данных в файле и рассматривать файл, как поток символов, аналогичный стандартному (консольному) потоку. Иными словами запись в файл и чтение из файла можно рассматривать как файловый вывод и ввод, соответственно.
Специальные последовательности (управляющие символы) используются для указания признака конца строки и конца файла.
Файловый объект и режимы работы
Для организации файлового ввода/вывода в программе создается файловый объект. Для его создания используется функция open() :
Режим | Описание |
---|---|
w | Открыть файл для записи. Если такой файл уже существует, то его содержимое удаляется (если это возможно) |
r | Открыть файл только для чтения |
a | Открыть файл для добавления, т.е. записи в конец файла. Предыдущее содержимое файла сохраняется |
r+ | Открыть файл для записи/чтения, содержимое файла сохраняется |
w+ | Открыть файл для записи/чтения, содержимое файла удаляется (см. w) |
Файл, который открывается для чтения, должен существовать в системе, а текущий пользователь (от лица которого запущен компилятор python) должен обладать правами для чтения этого файла. Если файл открывается для записи, то файл с именем, которое передается в качестве аргумента функции open() , будет создан автоматически, либо содержимое файла будет перезаписано, если такой файл уже существует (в этом случае права на данный файл должны позволять сделать это).
Нельзя открывать бинарные файлы (такие как jpeg, exe, doc) в текстовом режиме! Это может привести к тому, что файлы будут испорчены.Поскольку для файла input задан относительный путь, то он должен находиться в той же директории, что и файл исходника.
Методы readline(), write() и close()
Для чтения данных из файла (файловый ввод) используется метод
Обязательным аргументом является объект класса str . Объекты других типов должны быть преобразованы в строку с помощью функции преобразования str() . Метод write() возвращает количество записанных символов.
Работа с файловыми потоками должна быть завершена методом close() . Этот метод освобождает ресурсы и закрывает поток.
Чтобы работа с файлами в программе была структурирована, а освобождение ресурсов и закрытие потоков производилось в автоматическом режиме, используется специальный синтаксис менеджера контекста with-as .
Менеджер контекста with-as
Менеджер контекста определяет методы, которые могут быть вызваны внутри блока. Синтаксис менеджера контекста выглядит следующим образом:
Приведем пример программы в которой менеджер контекста используется для организации файлового потока ввода.
Задача 2. Текстовый файл состоит не более чем из 1'200'000 символов X , Y , и Z . Определите максимальное количество идущих подряд символов, среди которых нет подстроки XZZY . (Открытый вариант КЕГЭ-2021, зад. 24).
Файл к задаче.
Организация построчного чтения файла
В python файловые объекты являются итерируемыми. Это означает, что для построчного чтения файла можно использовать цикл for (стр. 10 в программе 9.6.3). Решим следующую задачу.
Задача 3. Записать в файл output 100 строк. Каждая строка должна содержать три случайных целых числа из интервала [1; 1000] , разделенных пробелами. Откройте этот файл в режиме чтения и определите максимальное значение среднего арифметического чисел в строках этого файла. Выведите это значение на экран.
Функция readlines()
Часто данные из файла продолжают обрабатываться в массивах. Но, вместо того, чтобы получать элементы массива при построчном чтении файла, можно получить массив строк непосредственно. Для этого используется метод
XML ( англ. eXtensible Markup Language) — расширяемый язык разметки, предназначенный для хранения и передачи данных.
Простейший XML-документ выглядит следующим образом:
Первая строка — это XML декларация. Здесь определяется версия XML (1.0) и кодировка файла. На следующей строке описывается корневой элемент документа <book> (открывающий тег). Следующие 4 строки описывают дочерние элементы корневого элемента ( title , author , year , price ). Последняя строка определяет конец корневого элемента </book> (закрывающий тег).
Документ XML состоит из элементов (elements). Элемент начинается открывающим тегом (start-tag) в угловых скобках, затем идет содержимое (content) элемента, после него записывается закрывающий тег (end-teg) в угловых скобках.
Информация, заключенная между тегами, называется содержимым или значением элемента: <author>Erik T. Ray</author> . Т.е. элемент author принимает значение Erik T. Ray . Элементы могут вообще не принимать значения.
Элементы могут содержать атрибуты, так, например, открывающий тег <title lang="en"> имеет атрибут lang , который принимает значение en . Значения атрибутов заключаются в кавычки (двойные или ординарные).
Некоторые элементы, не содержащие значений, допустимо записывать без закрывающего тега. В таком случае символ / ставится в конце открывающего тега:
Структура XML¶
XML документ должен содержать корневой элемент. Этот элемент является «родительским» для всех других элементов.
Все элементы в XML документе формируют иерархическое дерево. Это дерево начинается с корневого элемента и разветвляется на более низкие уровни элементов.
Все элементы могут иметь подэлементы (дочерние элементы):
Правила синтаксиса (Валидность)¶
Структура XML документа должна соответствовать определенным правилам. XML документ отвечающий этим правилам называется валидным (англ. Valid — правильный) или синтаксически верным. Соответственно, если документ не отвечает правилам, он является невалидным .
Основные правила синтаксиса XML:
- Теги XML регистрозависимы — теги XML являются регистрозависимыми. Так, тег <Letter> не то же самое, что тег <letter> .
Открывающий и закрывающий теги должны определяться в одном регистре:
- XML элементы должны соблюдать корректную вложенность:
- У XML документа должен быть корневой элемент — XML документ должен содержать один элемент, который будет родительским для всех других элементов. Он называется корневым элементом.
- Значения XML атрибутов должны заключаться в кавычки:
Сущности¶
Некоторые символы в XML имеют особые значения и являются служебными. Если вы поместите, например, символ < внутри XML элемента, то будет сгенерирована ошибка, так как парсер интерпретирует его, как начало нового элемента.
В примере ниже будет сгенерирована ошибка, так как в значении "ООО<Мосавтогруз>" атрибута НаимОрг содержатся символы < и > .
Также ошибка будет сгенерирована и в слудющем примере, если название организации взять в обычные кавычки (английские двойные):
Чтобы ошибки не возникали, нужно заменить символ < на его сущность. В XML существует 5 предопределенных сущностей:
Сущность | Символ | Значение |
---|---|---|
< | < | меньше, чем |
> | > | больше, чем |
& | & | амперсанд |
' | ' | апостроф |
" | " | кавычки |
Только символы < и & строго запрещены в XML. Символ > допустим, но лучше его всегда заменять на сущность.
Таким образом, корректными будут следующие формы записей:
В последнем примере английские двойные кавычки заменены на французские кавычки («ёлочки»), которые не являются служебными символами.
Поиск информации в XML файлах (XPath)¶
XPath ( англ. XML Path Language) — язык запросов к элементам XML-документа. XPath расширяет возможности работы с XML.
XML имеет древовидную структуру. В документе всегда имеется корневой элемент (инструкция <?xml version=”1.0”?> к дереву отношения не имеет). У элемента дерева всегда существуют потомки и предки, кроме корневого элемента, у которого предков нет, а также тупиковых элементов (листьев дерева), у которых нет потомков. Каждый элемент дерева находится на определенном уровне вложенности (далее — «уровень»). У элементов на одном уровне бывают предыдущие и следующие элементы.
Это очень похоже на организацию каталогов в файловой системе, и строки XPath, фактически, — пути к «файлам» — элементам. Рассмотрим пример списка книг:
XPath запрос /bookstore/book/price вернет следующий результат:
Сокращенная форма этого запроса выглядит так: //price .
В приведенной ниже таблице представлены некоторые выражения XPath и результат их работы:
Кодировки¶
И еще один важный момент, который стоит рассмотреть — кодировки. Существует множество кодировок, о них подробнее можно прочитать в статье Набор символов.
Самыми распространенными кириллическими кодировками являются Windows-1251 и UTF-8 . Последняя является одним из стандартов, но большая часть ФНС отчетности имеет кодировку Windows-1251 .
В XML файле кодировка объявляется в декларации:
Часто можно столкнуться с ситуацией, когда текстовый редаткор некорректно распознает кодировку и отображает кракозябры. В такой случае, необходимо выбрать кодировку вручную, для этого выполните:
Программа | Кодировка |
---|---|
Notepad++ | «Документ → Кодировка» |
Geany | «Документ → Установить кодировку» |
Firefox | «Вид → Кодировка» |
Chrome | «Настройка → Дополнительные инструменты → Кодировка» |
В большинстве случаев при работе с русскоязычными файлами помогает переключение кодировки на Windows-1251 или UTF-8 . Если все равно не удается прочитать содержимое XML документа, стоит открыть его в Mozilla Firefox, он отлично распознает кодировки.
Если ничего не помогает, вполне возможно, что файл был поврежден.
XSD схема¶
XML Schema — язык описания структуры XML-документа, его также называют XSD. Как большинство языков описания XML, XML Schema была задумана для определения правил, которым должен подчиняться документ. Но, в отличие от других языков, XML Schema была разработана так, чтобы её можно было использовать в создании программного обеспечения для обработки документов XML.
После проверки документа на соответствие XML Schema читающая программа может создать модель данных документа, которая включает:
- словарь (названия элементов и атрибутов);
- модель содержания (отношения между элементами и атрибутами и их структура);
- типы данных.
Каждый элемент в этой модели ассоциируется с определённым типом данных, позволяя строить в памяти объект, соответствующий структуре XML-документа. Языкам объектно-ориентированного программирования гораздо легче иметь дело с таким объектом, чем с текстовым файлом.
То есть мы должны объявить, что такому-то идентификатору (файловой переменной) соответствует имя файла на диске (включая устройство и путь). Для этого используется процедура Assign (в Делфи - AssignFile).
Синтаксис:
Assign( , ); Примеры:
Assign(tfu,'MyFile.txt'); Assign(fff,'.\dano.dat'); Assign(fara,'..\ff\ras2.dat'); Assign(fara,'D:\copy6\ras2.dat');
Процедура Assign применяется одинаково ко всем файловым типам. Если при вызове Assign для текстового файла не указана файловая переменная, то подразумеваются стандартные переменные: Input - клавиатура и Output - экран. Если вызывать read, readln или write, writeln без указания файловой переменной, также ввод будет с клавиатуры, а вывод - на экран.
Начало работы с файлом.
Типизированные и текстовые файлы:
Reset( ); Пример: reset(db2);Открывается СУЩЕСТВУЮЩИЙ файл, который соединен с этой переменной процедурой Assign. Файловый указатель ставится на начало файла (позиция = 0). ( После чего файл готов к чтению/записи первой записи).
ReWrite( ) Пример: rewrite(db2);
Открывается новый пустой файл и ему присваивается имя, заданное в процедуре Assign. Если файл с таким именем уже существует, он очищается. Файловый указатель ставится на начало файла (позиция = 0). ( После чего файл готов к записи первой записи, а после появления записей - к их чтению. При этом переставить файловый указатель можно либо процедурой reset, либо процедурой seek, описанной далее).
Дополнительно - текстовые файлы можно открыть для добавления данных в конец файла:
Append( ); Например: Append(ftx);
Удобно при налаживании программы выводить данные, используя пары: close; append; close; append; . и т д
Если убрать close, то нет гарантии, что все данные, которые "записаны" останутся в файле на диске.
Нетипизированные файлы.
Чтение из файла
Типизированные файлы
- Байты файла, начиная от текущего положения файлового указателя, в количестве, соответствующем произведению длины базового типа на количество переменных копируются в переменные.
- Файловый указатель перемещается на это же количество байт вперед, к началу соответствущей записи.
Текстовые файлы
Параметры-переменные, которые заполняются данными при помощи процедур read/readln из текстовых файлов, могут иметь типы: char, string, PChar, численные типы (целые и вещественные). Аналогично, процедуры write/writeln записывают из параметров- выражений этих же типов и boolean (в виде true или false). Процедура read имеет синтаксис:read ([ ,] , . ); При этом данные (численные), записанные в файле, должны отделяться друг от друга пробелом или знаком табуляции, так что очередная порция данных между разделителями сохраняется в очередной переменной из списка параметров. Переменная-буфер должна иметь тип - один из численных.
Если переменная-буфер имеет тип char, то данные в файле читаются посимвольно в соответствующие переменные.
Нетипизированные файлы
- Содержимое переменных записывается в файл, начиная от текущего положения файлового указателя.
- Файловый указатель перемещается на соответствующее число байт вперед.
Текстовые файлы
Нетипизированные файлы
Примечание:
В Делфи для работы с файлами можно применять класс TFileStream, а также описанные выше средства Turbo - Pascal7, однако вместо Assign -> AssignFile, Close -> CloseFile, Text -> TextFile. Удобно также пользоваться методами .SaveToFile класса TStrings (компонеты Memo,ListBox и др.).
После того как создана файловая структура, с дискетой можно начи-
нать работать. Для получения информации о дискете TR-DOS предоставляет
пользователю две команды: CAT и LIST. Обе команды выдают содержимое
каталога диска, только CAT используется для получения краткой справки, а
LIST выводит полную информацию как о файлах, так и о дискете в целом.
Формат команд одинаков:
имя дисковода, в который вставлена дискета;
п
номер потока, в который TR-DOS направит выводимый каталог.
Рис. 17, Выполнение команд CAT и LIST.
Рис. 17, Выполнение команд CAT и LIST.
Если команды CAT и LIST введены без параметров, то будет выдан
каталог с дискеты, вставленной в текущий дисковод, в поток 2, то есть на
основной экран, причем предварительно экран будет очищен. Для получе-
ния каталога с отличного от текущего диска его необходимо явно указать в
команде. Возможность переназначить устройство вывода предоставляется
бейсик-системе и тем самым делает TR-DOS более гибкой. Например, для
распечатки каталога на принтере нужно просто задать вывод в 3 поток*.
Попробуйте вывести каталог обеими командами только что отформа-
тированной дискеты. Конечно, информации о файлах Вы не увидите, но
кое-какое представление о работе команд получите. Для примера разберем
распечатку каталога тестовой дискеты (рис. 17).
Верхние три строки в распечатке каталога дискеты служебные. Ко-
манда CAT выводит сюда имя диска (Title), заданное при форматирование в
команде FORMAT, а также количество файлов (File(s)) и число удаленных
файлов (Del. File). Далее следует информация о записанных на дискете
файлах. Каждая строка предваряется именем дисковода, в который вставлена
дискета. Для файла приводится его имя, тип (символ в угловых скобках) и
объем файла в секторах. Файлы выдаются в каталоге последовательно, в том
порядке, в каком они хранятся на дискете.** Заканчивает каталог число
незанятых секторов (Free).
Имя дисковода (Disk Drive) и количество свободных секторов (Free
Sector) вынесены в команде LIST наверх в служебные строки. Кроме этого,
здесь выдаются еще параметры дискеты: число дорожек (Track) и количество
сторон (Side). Расширена также информация о файлах. Помимо имени, типа
и объема в секторах, приводятся три дополнительных параметра (Start, Length,
Line), назначение которых определяется типом файла и подробно описано в
разделе «Планирование дискового пространства».
Вся выводимая информация берется командами CAT и LIST из области
каталога диска***, детальное описание которой приведено в разделе «Эле-
мент каталога».
*) Более подробная информация о взаимодействии каналов и потоков в
бейсик-системе представлена в главе «Архитектура ZX Spectrum».
**) Если количество файлов велико и информация о них не помещается на
экране, то выдается запрос scroll? Отметим, что прерывание вывода может
повлечь за собой разрушение системы, так как из-за ошибки в TR-DOS
не сохраняется регистровая пара HL
***)А для бейсик-программ — еще и из самих файлов.
РАБОТА С ФАЙЛАМИ
Это, пожалуй, самый необходимый раздел, который нужно знать для
правильной работы в рамках дисковой операционной системы.
Команды, синтаксис, типы файлов
Ниже будут подробно рассмотрены команды ОС TR-DOS, предназна-
ченные для работы с файлами. Все они имеют сходный синтаксис, то есть
формат записи команды для работы, например, с фрагментом кода или
массивом данных аналогичен.
Каждому файлу, хранящемуся на дискете, присваивается уникальная
спецификация, которая включает в себя имя файла и его тип. Имя файла
состоит не более чем из 8 символов, и, в отличие от имен файлов на
магнитной ленте, не может быть «пустым». В командах имя файла заключают
в кавычки.
Необходимо еще сказать об одной особенности задания имени файла.
Указание только имени и типа файла не достаточно для определения его
местонахождения. Мы уже упоминали о том, что система TR-DOS поддержи-
вает работу с четырьмя дисководами и, естественно, в команде необходимо
как-то указать, в каком дисководе находится дискета с файлом. Как и во
многих других случаях, здесь тоже используется принцип умолчания: если
ничего не сказано, то работаем с текущим дисководом. Если же нужно задать
другой дисковод, то его имя указывается в команде перед именем файла и
отделяется от него символом двоеточия. Заметьте, что имя диска записывается
внутри кавычек.
Итак, полная спецификация файла определяется такой строкой:
Теперь рассмотрим синтаксические примеры. Команды для работы с
бейсик-программами будут выглядеть следующим образом:
Для команд, работающих с фрагментами кодов, синтаксис будет
следующий:
Command "[Drive:]Fi!e_name"CODE [Start[,Length]]
где Start и Length необязательные параметры, задающие начало кодового
фрагмента (Start) и его длину в байтах (Length)*. Более подробно об этом
будет рассказано при описании команд.
Синтаксис команд, работающих с массивами, такой:
Command "[Drive:]Fiie_„name" DATA Dim_name[$]()
где DIM_NAME — имя переменной массива. В отличие от Бейсика, в TR-DOS
не делается различий при хранении числовых и строчных массивов. Разли-
чаются они по имени переменной массива (напомним, что в Бейсике имя
переменной числового массива состоит из одной буквы, а символьного — из
буквы и символа $).
Синтаксис команд, работающих с файлами прямого и последователь-
ного доступа, следующий:
Создание файлов, сохранение данных
Только после того, как на диске была создана файловая структура,
можно непосредственно приступать к работе с файлами. Для создания
файлов в ОС TR-DOS предназначена команда SAVE**, которая позволяет
сохранить на диске текст программы на Бейсике, фрагмент кодов или
значения массива данных.
Бейсик-программы сохраняются на дискетах так же, как и на магнит-
ной ленте, то есть в файле вместе с текстом программы будет сохранено и
содержимое определенных к моменту сохранения переменных. Можно ука-
зать и номер строки автозапуска — с этой строки начнется исполнение
программы при последующем выполнении команд LOAD или RUN. Для этого
вслед за именем файла необходимо указать ключевое слово LINE с парамет-
ром — номером строки автозапуска. Если параметр опущен, предполагается
строка с номером 1. В отличие от файлов, сохраненных на ленте, в TR-DOS
невозможно автоматически передать управление на строку с нулевым номе-
ром.
Создание файла PROGRAM на текущем диске и запись в него беясик-
программы, находящейся в памяти компьютера, производится командой
Создание файла MyProg на дисководе А, запись в него бейсик-програм-
мы из памяти компьютера, задание строки автозапуска с номером 10
выполняет команда
SAVE "a:MyProg" LINE 10
*) После ключевого слова CODE может стоять параметр SCREENS, который,
как и в Бейсике, указывает на работу с файлом экрана и эквивалентен
значениям Start=l 6384 и Length=6912. Однако из-за ошибки TR-DOS
лучше всегда указывать числовые параметры.
Как и для бейсик-программ, сохранение кодовых фрагментов на
дисках практически не отличается от сохранения на магнитной ленте. В
команде обязательно задание параметров — адреса начала кодового фраг-
мента в памяти компьютера и его длины в байтах.
Создание файла CODE на дисководе В и сохранение в нем кодового
фрагмента с начальным и конечным адресами 30000и31999 включительно
(длина фрагмента в этом случае составит 31999-30000+1 — 2000 байт):
SAVE "b:CODE"CODE 30000,2000
Сохранение массивов также не представляет трудностей.
Создание файла NUMBER и сохранение в нем числового массива,
содержащегося в переменной D:
SAVE "NUMBER" DATA D()
Создание на диске в дисководе С файла с именем CHARS и сохранение
в нем символьного массива из переменной С$:
SAVE "С:CHARS" DATA с$
Переименование файлов
Изменение имени файла может потребоваться по разным причинам,
например, Вы хотите, чтобы при инициализации системы автоматически
запускалась Ваша программа MyProg. Для этого содержащий ее файл необ-
ходимо переименовать в boot. В TR-DOS это делается с помощью команды
NEW, за которой должны следовать через запятую два имени файла. Пер-
вое — новое имя файла, второе — старое. Тип нового файла будет такой же,
как и тип старого. Учтите, что команда NEW может переименовывать только
файлы, расположенные на одном диске.
Заметим, что после переименования файл остается тем же самым и
занимает то же самое место на диске, изменяется только его имя в каталоге.
Переименование файла MyProg в файл boot:
Переименование файла Code, содержащего кодовый фрагмент, в
файл filecode:
Читайте также: