Сабт кардан дар файл
Додаҳоро барои чӣ сабт мекунем
Тағйирёбандаҳои Python танҳо то анҷоми раванд зиндагӣ мекунанд. Корбар бошад интизор аст, ки баъди оғози дубораи барнома низ сабтҳояшро бинад. Пас барнома ба нигоҳдории доимӣ, формати фаҳмои файл ва коркарди ҳолатҳои набудан ё вайрон шудани файл ниёз дорад.
Дар ин мавзӯъ JSON — формати матнӣ барои ададҳо, сатрҳо, қиматҳои мантиқӣ, рӯйхатҳо ва объектҳо — истифода мешавад. Он барои ҳуҷҷатҳои хурд ва танзимот мувофиқ аст. Сабт чанд вазифа дорад: омода кардани додаҳо, табдили онҳо ба матн ва навиштани байтҳо ба диск. Барои ёфтани хато ин қадамҳоро фарқ кардан фоида дорад.
1. Объекти Python ва матни JSON
Сериализатсия додаҳоро ба шакли муносиб барои нигоҳдорӣ ё интиқол табдил медиҳад. json.dumps сатри JSON-ро бармегардонад ва json.loads чунин сатрро боз мехонад. Ин иҷрои коди Python нест: масалан, True дар JSON ҳамчун true навишта мешавад.
import json
text = json.dumps({"city": "Душанбе", "open": True}, ensure_ascii=False)
print(text)
data = json.loads(text)
print(data["city"], type(data["open"]).__name__)
Натиҷа:
{"city": "Душанбе", "open": true}
Душанбе bool
Аввал матни JSON ва баъд қимат аз луғати барқароршуда ва номи навъи он чоп мешаванд. ensure_ascii=False ҳарфҳои Unicode-ро хонданӣ нигоҳ медорад. Бе ин параметр низ JSON сатрро дуруст нигоҳ дошта метавонад, вале қисми аломатҳо бо escape-пайдарпайиҳо навишта мешаванд. Ин параметр намуди матнро идора мекунад, на рамзгузории файлро.
JSON объектҳои дилхоҳи Qt-ро сабт намекунад. Аввал додаҳои одиро гиред: сатрҳо аз муҳаррир, ададҳо, рӯйхатҳо ва луғатҳо. Сабт кардани худи QPlainTextEdit ба ҷойи матни он интихоби нодурусти додаҳо барои нигоҳдорӣ аст.
2. Роҳ, рамзгузорӣ ва ҷараёни файл
Path роҳ ба файлро ифода мекунад. Ифодаи folder / "settings.json" қисмҳои роҳро мепайвандад. Рамзгузории UTF-8 муайян мекунад, ки матн чӣ гуна ба байтҳо табдил меёбад; онро ҳангоми кушодани файли матнӣ нишон медиҳанд. Рамзгузории ошкор имкон медиҳад файл дар компютерҳои гуногун яксон хонда шавад.
Дар охири dump ва load ҳарфи s нест: онҳо бо ҷараёни кушодаи файл кор мекунанд. with онро баъди блок, аз ҷумла ҳангоми истисно, мебандад. Ҷузвдони муваққатии мисол баъди санҷиш нест мешавад ва файлҳои корбар тағйир намеёбанд.
import json
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as folder:
path = Path(folder) / "settings.json"
with path.open("w", encoding="utf-8") as stream:
json.dump({"theme": "тира"}, stream, ensure_ascii=False, indent=2)
with path.open(encoding="utf-8") as stream:
settings = json.load(stream)
print(path.exists(), settings["theme"])
Натиҷа:
True тира
"w" файлро месозад ё файли мавҷударо аз нав менависад; кушодан барои хондан ба таври пешфарз "r" аст. Параметри indent=2 дидани JSON-ро осон мекунад. Он ороишро иваз мекунад, на маънои додаҳоро.
3. Синтаксиси файл ва сохтори додаҳо
JSON-и дуруст ҳанӯз ҳуҷҷати мувофиқ буданро намефаҳмонад. Рӯйхати [] ва объекти {} ҳар ду дурустанд, вале барнома метавонад танҳо луғат бо майдонҳои муайянро интизор бошад. Пас баъди хондан ду санҷиш лозим аст: оё матн таҳлил шуд ва оё навъҳои қиматҳои барқароршуда мувофиқанд.
import json
for text in ('{"items": []}', '[]', '{broken'):
try:
data = json.loads(text)
except json.JSONDecodeError:
print("JSONDecodeError")
else:
print(isinstance(data, dict))
Натиҷа:
True
False
JSONDecodeError
Матни аввал луғат, дуюм рӯйхат медиҳад ва сеюмро таҳлил кардан имкон надорад. json.JSONDecodeError ба синтаксиси JSON дахл дорад. OSError ҳангоми кор бо файл мушкили дигарро мефаҳмонад: масалан, файл нест ё дастрасӣ нест. Рамзгузории вайрон метавонад алоҳида UnicodeDecodeError диҳад.
Хатоҳои интизоршавандаро дар сатҳе коркард кунед, ки қарор гирифта метавонед: паём нишон додан, файли дигар пешниҳод кардан ё ҳуҷҷати холӣ кушодан. except:-и аз ҳад васеъ хатоҳои худи кодро низ пинҳон мекунад. Агар формат инкишоф ёбад, майдони версия сохторҳои кӯҳна ва навро фарқ мекунад; маънои онро мантиқи барнома бояд санҷад.
4. Равзанаи асосӣ ва амали меню
QMainWindow равзана бо ҷойҳои тайёр барои меню, панелҳои абзор ва сатри ҳолат аст. Дар марказ як виджети асосӣ ҷойгир мешавад, ки онро бо setCentralWidget мегузоранд. Агар он ҷо чанд унсур лозим бошад, виджети марказиро контейнер бо layout-и худ месозанд.
QAction амалро тавсиф мекунад: навишта, миёнбур ва сигнали triggered. Як объекти амалро ба меню ва панели абзор илова кардан мумкин аст, то ҳар ду фармон як коркардкунандаро оғоз кунанд. Худи сохтани QAction чизеро сабт намекунад.
from PySide6.QtGui import QAction
from PySide6.QtWidgets import QApplication, QMainWindow, QPlainTextEdit
app = QApplication.instance() or QApplication([])
window = QMainWindow()
editor = QPlainTextEdit()
window.setCentralWidget(editor)
action = QAction("Санҷидан", window)
action.setShortcut("Ctrl+K")
action.triggered.connect(lambda: window.statusBar().showMessage("Омода"))
window.menuBar().addMenu("Файл").addAction(action)
action.trigger()
print(window.centralWidget() is editor, action.shortcut().toString())
print(window.statusBar().currentMessage())
Натиҷа:
True Ctrl+K
Омода
trigger() амалро аз код оғоз мекунад, бинобар ин паём бе интихоби банди меню бо муш дар сатри ҳолат пайдо мешавад. Дар равзанаи воқеӣ ҳамин амал аз меню ва Ctrl+K дастрас аст. Сатри ҳолат натиҷаи амалро нишон медиҳад, вале ҷойи сабти додаҳо ба файлро намегирад.
Барои интихоби роҳ QFileDialog.getSaveFileName(...) ҳаст: натиҷа ном ва филтри интихобшударо дорад. Номи холӣ бекоркуниро мефаҳмонад; баъди он файлро барои навиштан накушоед. QMessageBox барои саволҳо ва паёмҳои хато мувофиқ аст. Муколамаҳо интерактивӣ ҳастанд, бинобар ин дар ин мисолҳои чопкунанда онҳоро намекушоем.
5. «Тағйироти сабтнашуда ҳаст» чӣ маъно дорад
Нусхаи сабтшуда акси додаҳо баъди навиштани охирини муваффақ аст. Ҳолати «тағйирёфта» фарқ доштани додаҳои ҷорӣ аз ин нусхаро мефаҳмонад. Он набояд баъди ҳар пахши тугма ҳамеша дуруст монад: корбар метавонад матни аслиро баргардонад.
saved_text = "Qt"
text = "Qt!"
print(text != saved_text)
text = "Qt"
print(text != saved_text)
Натиҷа:
True
False
Баъди баргардондани матни аслӣ фарқият нест. Ситорача дар сарлавҳа танҳо ҳамин ҳолатро нишон медиҳад. Нусхаи нави сабтшударо баъди навиштани муваффақ нигоҳ медоранд, на пеш аз кӯшиш: агар диск дастнорас бошад, тағйирот ҳанӯз сабт нашудааст.
Дар дохил чӣ рӯй медиҳад
Занҷираи сабт: виджетҳо → додаҳои одии Python → JSON → ҷараёни матнии UTF-8 → файл. Боркунӣ баръакс мегузарад ва сохторро низ месанҷад. Меню ва тугмаҳо танҳо ин амалҳоро оғоз мекунанд; табдили додаҳоро аз сохтани равзана ҷудо нигоҳ доред.
Навиштан бо "w" аввал файли мавҷударо кӯтоҳ мекунад. Барои барномаи боэътимодтар метавонед аввал файли муваққатиро дар паҳлуи файли ҳадаф пурра навишта, баъд файли ҳадафро иваз кунед. Ҳангоми бастани равзана closeEvent имкон медиҳад сабт, даст кашидан аз тағйирот ё бекор кардани бастан пешниҳод шавад. Ин такмили интерфейс аст ва ҷойи санҷишҳои вуруду бароришро намегирад.
Хатоҳои маъмул ва ислоҳи онҳо
json.dump(data, path): ба ҷойи ҷараён роҳ дода шуда, хато пайдо мешавад. Файлро боwith path.open(...) as streamкушода,streamдиҳед.- Истифодаи
ensure_ascii=Falseбеencoding="utf-8": дар системаи дигар файл метавонад нодуруст хонда шавад. Ҳам намуди JSON ва ҳам рамзгузории ҷараёнро танзим кунед. - Фавран гирифтани
data["items"]бе санҷишиdata: JSON-и дуруст метавонад рӯйхат ё адад бошад. Аввал сохтори заруриро боisinstanceсанҷед. - Кушодани файл барои навиштан пеш аз санҷиши бекоркунии муколама: роҳи холӣ хато медиҳад. Аввал бовар кунед, ки корбар ном интихоб кардааст.
- Пеш аз навиштан бардоштани нишонаи тағйирот: баъди хатои сабт интерфейс бардурӯғ муваффақиятро нишон медиҳад. Нусха ва ҳолатро танҳо баъди анҷоми муваффақ нав кунед.
Ёддошти кӯтоҳ
| Вазифа | Восита |
|---|---|
| JSON ба сатр / аз сатр | json.dumps / json.loads |
| JSON ба ҷараён / аз ҷараён | json.dump / json.load |
| Рамзгузории яксон | encoding="utf-8" |
| Ҳарфҳои хондании Unicode / фосилаҳои сатҳбандӣ | ensure_ascii=False / indent=2 |
| Хатои файл / синтаксиси JSON | OSError / json.JSONDecodeError |
| Санҷиши сохтор | isinstance ва санҷиши майдонҳо |
| Меню ва фармон | QMainWindow, QAction, triggered |
| Тағйироти сабтнашуда | муқоиса бо нусхаи охирини муваффақ |