[Python, XML] Модуль для работы с XML файлами
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Что будем делать
Сегодня мы с Вами сделаем модуль для работы с XML файлами.
Зачем
Иногда при разработке программы на Python требуется сделать настройки, которые сможет поменять любой пользователь без изменения кода.
Что нам понадобится
- Знание ЯП Python
- Python3
- Python библиотеки: xml и time
Начнем
Для начала импортируем все необходимые библиотеки и создадим основной класс.
import xml.etree.ElementTree as xml
import time
class XML:
pass
Для работы с XML файлом нам понадобится сам XML файл, но на первом запуске программы у пользователя может не оказаться этого файла, по этому нам понадобится создать его.
При создание экземпляра класса передадим имя файла и сохраним его в параметр fileName.
import xml.etree.ElementTree as xml
import time
class XML:
fileName:str
def __init__(self, fileName):
self.fileName = fileName + ".xml"
Теперь напишем функцию, которая будет проверять существует ли наш файл и будем вызывать ее в момент создания экземпляра класса.
import xml.etree.ElementTree as xml
import time
class XML:
fileName:str
def __init__(self, fileName):
self.fileName = fileName + ".xml"
self.openFile()
def openFile(self):
try:
file = open(self.fileName, "r")
except FileNotFoundError:
print("File not found")
Далее напишем функцию, которая создаст наш файл если его нет, и будем вызывать его, если программа не нашла файла.
class XML:
fileName:str
def __init__(self, fileName):
self.fileName = fileName + ".xml"
self.openFile()
def openFile(self):
try:
file = open(self.fileName, "r")
except FileNotFoundError:
self.createFile()
def createFile(self):
rootXML = xml.Element("settings")
text = xml.Element("text")
text.text = "Text"
rootXML.append(text)
file = open(self.fileName, "w")
file.write(xml.tostring(rootXML, encoding="utf-8", method="xml").decode(encoding="utf-8"))
file.close()
Теперь более подробно разберем функцию XML.createFile():
- rootXML — это основной элемент, который позволит записать все настройки в новый файл гораздо быстрее чем, если бы мы записывали все теги по отдельности
- text — тег, который будет отображаться внутри rootXML. В поле Element.text указываем, что должно быть внутри элемента
Для того, чтобы сделать список элементов, например:
<settings>
<text>Hello, world!</text>
<list>
<item>1</item>
<item>2</item>
<item>3</item>
</list>
</settings>
Создайте главный элемент, в нашем случаи «list» и субэлементы «item».
list = xml.Element("list")
rootXML.append(list)
item: xml.SubElement
item = xml.SubElement(list, "item")
item.text = "1"
item = xml.SubElement(list, "item")
item.text = "2"
item = xml.SubElement(list, "item")
item.text = "3"
#xml.SubElement(parent: xml.Element or xml.SubElement, tag: str)
#Также можно сделать субэлемент в субэлементе
Если наша программа — программа с интерфейсом, а файл настроек используется для сохранения каких-либо значений, которые может изменить пользователь, то нам понадобится функция, которая может изменить значение элемента. Давайте напишем ее.
class XML:
fileName:str
def __init__(self, fileName):
self.fileName = fileName + ".xml"
self.openFile()
def openFile(self):
try:
file = open(self.fileName, "r")
except FileNotFoundError:
self.createFile()
def createFile(self):
rootXML = xml.Element("settings")
text = xml.Element("text")
text.text = "Text"
rootXML.append(text)
file = open(self.fileName, "w")
file.write(xml.tostring(rootXML, encoding="utf-8", method="xml").decode(encoding="utf-8"))
file.close()
def editFile(self, element, value):
tree = xml.ElementTree(file=self.fileName)
rootXML = tree.getroot()
for elem in rootXML.iter(element):
elem.text = str(value)
tree = xml.ElementTree(rootXML)
tree.write(self.fileName)
В функцию editFile() мы передаем имя элемента(element), который хотим изменить и новое значение(value).
И последнее, что нужно для любой работы с XML файлами — это парсинг данных.
class XML:
fileName:str
def __init__(self, fileName):
self.fileName = fileName + ".xml"
self.openFile()
def openFile(self):
try:
file = open(self.fileName, "r")
except FileNotFoundError:
self.createFile()
def createFile(self):
rootXML = xml.Element("settings")
text = xml.Element("text")
text.text = "Text"
rootXML.append(text)
file = open(self.fileName, "w")
file.write(xml.tostring(rootXML, encoding="utf-8", method="xml").decode(encoding="utf-8"))
file.close()
def editFile(self, element, value):
tree = xml.ElementTree(file=self.fileName)
rootXML = tree.getroot()
for elem in rootXML.iter(element):
elem.text = str(value)
tree = xml.ElementTree(rootXML)
tree.write(self.fileName)
def parsingFile(self, elements, text = True):
tree = xml.ElementTree(file=self.fileName)
rootXML = tree.getroot()
for element in rootXML.iter(elements):
if (text):
return element.text
return element
В метод parsingFile() мы передаем имя тега(element), который хотим получить и boolean значение какой тип данных нам вернуть. Если text = True то вернется значение элемента, иначе объект, который после можно будет перебрать. Например у нас есть XML файл:
<settings>
<text>Hello, world!</text>
<list>
<item>1</item>
<item>2</item>
<item>3</item>
</list>
</settings>
И если мы хотим вывести в консоль все значения item, то мы парсим параметр «list» и в parsingFile() 2-м параметром передаем False. Начинаем перебирать полученный элемент и выводить element.text — имеющий значение выбранного элемента.
import XML as xml
moduleXml = xml.XML("settings")
for element in moduleXml.parsingFile("list", False):
print(element.text)
После выполнения данного кода в консоли мы увидим:
1
2
3
Заключение
В итоге у нас получился модуль, который можно использовать в своих проектах для работы с XML файлами.
Проект на gitHub
Всем спасибо и удачи.
===========
Источник:
habr.com
===========
Похожие новости:
- [Python, API] Чертыре способа получить аудио вк или «это не баг, а фича»
- [Open source, Системное администрирование, Виртуализация, Разработка под Linux] Разработка и тестирование Ansible-ролей с использованием Molecule и Podman
- [Облачные сервисы] Установка базы данных SAP HANA в Яндекс Облаке. Пошаговое руководство
- [Python, Обработка изображений] OpenCV в Python. Часть 1
- [Python, Тестирование веб-сервисов] Как читать файлы конфигурации в тестах с Selenium на Python (перевод)
- [Python, Астрономия, Суперкомпьютеры, Экология] Астрономам порекомендовали меньше использовать суперкомпьютеры и Python из-за вреда экологии
- [DevOps, Kubernetes, Интервью, Серверное администрирование] Команда поддержки систем хранения данных Bloomberg полагается на открытый исходный код и SDS (перевод)
- [Python, Data Engineering] Pikabu-dataset
- [Системы обмена сообщениями, Python, Программирование, Анализ и проектирование систем] Система отложенного исполнения на RabbitMQ
- [Big Data, Data Mining, Python, Открытые данные] Преступления на почве расизма в США: статистический анализ
Теги для поиска: #_python, #_xml, #_python3, #_xml, #_tutorial, #_python, #_xml
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 25-Ноя 07:34
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Что будем делать Сегодня мы с Вами сделаем модуль для работы с XML файлами. Зачем Иногда при разработке программы на Python требуется сделать настройки, которые сможет поменять любой пользователь без изменения кода. Что нам понадобится
Начнем Для начала импортируем все необходимые библиотеки и создадим основной класс. import xml.etree.ElementTree as xml
import time class XML: pass Для работы с XML файлом нам понадобится сам XML файл, но на первом запуске программы у пользователя может не оказаться этого файла, по этому нам понадобится создать его. При создание экземпляра класса передадим имя файла и сохраним его в параметр fileName. import xml.etree.ElementTree as xml
import time class XML: fileName:str def __init__(self, fileName): self.fileName = fileName + ".xml" Теперь напишем функцию, которая будет проверять существует ли наш файл и будем вызывать ее в момент создания экземпляра класса. import xml.etree.ElementTree as xml
import time class XML: fileName:str def __init__(self, fileName): self.fileName = fileName + ".xml" self.openFile() def openFile(self): try: file = open(self.fileName, "r") except FileNotFoundError: print("File not found") Далее напишем функцию, которая создаст наш файл если его нет, и будем вызывать его, если программа не нашла файла. class XML:
fileName:str def __init__(self, fileName): self.fileName = fileName + ".xml" self.openFile() def openFile(self): try: file = open(self.fileName, "r") except FileNotFoundError: self.createFile() def createFile(self): rootXML = xml.Element("settings") text = xml.Element("text") text.text = "Text" rootXML.append(text) file = open(self.fileName, "w") file.write(xml.tostring(rootXML, encoding="utf-8", method="xml").decode(encoding="utf-8")) file.close() Теперь более подробно разберем функцию XML.createFile():
Для того, чтобы сделать список элементов, например: <settings>
<text>Hello, world!</text> <list> <item>1</item> <item>2</item> <item>3</item> </list> </settings> Создайте главный элемент, в нашем случаи «list» и субэлементы «item». list = xml.Element("list")
rootXML.append(list) item: xml.SubElement item = xml.SubElement(list, "item") item.text = "1" item = xml.SubElement(list, "item") item.text = "2" item = xml.SubElement(list, "item") item.text = "3" #xml.SubElement(parent: xml.Element or xml.SubElement, tag: str) #Также можно сделать субэлемент в субэлементе Если наша программа — программа с интерфейсом, а файл настроек используется для сохранения каких-либо значений, которые может изменить пользователь, то нам понадобится функция, которая может изменить значение элемента. Давайте напишем ее. class XML:
fileName:str def __init__(self, fileName): self.fileName = fileName + ".xml" self.openFile() def openFile(self): try: file = open(self.fileName, "r") except FileNotFoundError: self.createFile() def createFile(self): rootXML = xml.Element("settings") text = xml.Element("text") text.text = "Text" rootXML.append(text) file = open(self.fileName, "w") file.write(xml.tostring(rootXML, encoding="utf-8", method="xml").decode(encoding="utf-8")) file.close() def editFile(self, element, value): tree = xml.ElementTree(file=self.fileName) rootXML = tree.getroot() for elem in rootXML.iter(element): elem.text = str(value) tree = xml.ElementTree(rootXML) tree.write(self.fileName) В функцию editFile() мы передаем имя элемента(element), который хотим изменить и новое значение(value). И последнее, что нужно для любой работы с XML файлами — это парсинг данных. class XML:
fileName:str def __init__(self, fileName): self.fileName = fileName + ".xml" self.openFile() def openFile(self): try: file = open(self.fileName, "r") except FileNotFoundError: self.createFile() def createFile(self): rootXML = xml.Element("settings") text = xml.Element("text") text.text = "Text" rootXML.append(text) file = open(self.fileName, "w") file.write(xml.tostring(rootXML, encoding="utf-8", method="xml").decode(encoding="utf-8")) file.close() def editFile(self, element, value): tree = xml.ElementTree(file=self.fileName) rootXML = tree.getroot() for elem in rootXML.iter(element): elem.text = str(value) tree = xml.ElementTree(rootXML) tree.write(self.fileName) def parsingFile(self, elements, text = True): tree = xml.ElementTree(file=self.fileName) rootXML = tree.getroot() for element in rootXML.iter(elements): if (text): return element.text return element В метод parsingFile() мы передаем имя тега(element), который хотим получить и boolean значение какой тип данных нам вернуть. Если text = True то вернется значение элемента, иначе объект, который после можно будет перебрать. Например у нас есть XML файл: <settings>
<text>Hello, world!</text> <list> <item>1</item> <item>2</item> <item>3</item> </list> </settings> И если мы хотим вывести в консоль все значения item, то мы парсим параметр «list» и в parsingFile() 2-м параметром передаем False. Начинаем перебирать полученный элемент и выводить element.text — имеющий значение выбранного элемента. import XML as xml
moduleXml = xml.XML("settings") for element in moduleXml.parsingFile("list", False): print(element.text) После выполнения данного кода в консоли мы увидим: 1
2 3 Заключение В итоге у нас получился модуль, который можно использовать в своих проектах для работы с XML файлами. Проект на gitHub Всем спасибо и удачи. =========== Источник: habr.com =========== Похожие новости:
|
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 25-Ноя 07:34
Часовой пояс: UTC + 5