Всем привет, сегодня мы начнём писать небольшой терминал на Python с собственной файловой системой (виртуальной и мало чего умеющей).
#1 Файловая система — Вы здесь
#2 Приложения
#3 Обработчик команд
#4 Терминал
Структура файлов в нашем проекте
Вот как находятся файлы нашего терминала:
| pyterminal |-- filesystem.py |-- terminal.py |-- com_handler.py |-- apps |--- notepad.py |--- compiler.py |--- brainf.py |--- calculator.py |--- file_manager.py |--- browser.py
Сейчас наш файл это filesystem.py.
Пишем файловую систему
В этом заголовке будут реализованы классы для файлов и также диска.
Импортируем нужную библиотеку:
try: from dataclasses import * except: #ниже 3.7 raise SystemExit('Данная версия должа быть 3.7 и выше')
Импортируем библиотеку для датаклассов и если не получилось то это python версии 3.6 и ниже. Так что выходим с сообщением о версии.
Класс для ошибки:
class FSerror(Exception): pass
Слишком легко чтобы объяснять.
Теперь класс для файла:
#тут сами файлы files = {} @dataclass class File: ''' Класс файла name (str): имя файла text (any): содержимое файла ''' name: str text: str def save(self): files[self.name] = self.text
any — это любой тип
save — метод чтобы сохранить файл
name — параметр имени
text — параметр где текст
Класс для диска:
class Disk: ''' Класс диска name (str): имя диска ''' def __init__(self, name): self.name = name self.children = [] def add(self, file): if file in files: self.children.append(file) else: raise FSerror(f'Файл "{file}" не найден') def get(self, name): if name in self.children: return files[name] raise FSerror(f'Файл "{name}" не найден') def delete(self, name): if name in self.children: del files[name] raise FSerror(f'Файл "{name}" не найден') c = Disk('C:')
Получается лишь один диск. И это диск «C»
add — добавить файл в диск
get — получить файл в диске
delete — удалить файл
Теперь объявим переменную __all__ (чтобы не было не нужных использований):
__all__ = ['File', 'files', 'c']
Весь код.
try: from dataclasses import * except: #ниже 3.7 raise SystemExit('Данная версия должа быть 3.7 и выше') class FSerror(Exception): pass #тут сами файлы files = {} @dataclass class File: ''' Класс файла name (str): имя файла text (str): содержимое файла ''' name: str text: str def save(self): files[self.name] = self.text class Disk: ''' Класс диска name (str): имя диска ''' def __init__(self, name): self.name = name self.children = [] def add(self, file): if file in files: self.children.append(file) else: raise FSerror(f'Файл "{file}" не найден') def get(self, name): if name in self.children: return files[name] raise FSerror(f'Файл "{name}" не найден') def delete(self, name): if name in self.children: del files[name] raise FSerror(f'Файл "{name}" не найден') c = Disk('C:') __all__ = ['File', 'files', 'c']
Всего 53 строчек кода. Очень мало но работает.
Итог этой части.
Мы сделали файловую систему для терминала. Вот пример использования:
#в PyShell >>> hello = File('hello', '123') >>> hello.save() >>> c.add('hello') >>> print(c.get('hello')) 123 >>> c.delete('hello') >>> print(c.get('hello')) Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> print(c.get('hello')) File "C:\Users\DRA\Desktop\owner.py", line 44, in get raise FSerror(f'Файл "{name}" не найден') FSerror: Файл "hello" не найден >>>
Готово. Продолжение следует.
ссылка на оригинал статьи https://habr.com/ru/articles/901814/
Добавить комментарий