Ачааллж байна...
Өнөөдөр шүүгээний түлхүүр гарт чинь орно. Өмнөх хичээлд бид том зургаа зурсан: ширээ (санах ой) ба шүүгээ (диск), гурван алхамт ажиллагаа — нээх, унших/бичих, хаах — тэгээд "нэг харцын" хоёр багц код үзүүлсэн. Өнөөдөр тэр хоёр багцыг тэмдэгт бүрээр нь задалж, өөрийн гараар бичиж, бүтэн тойргийг гүйцээнэ: программаараа файл үүсгэж, дотор нь бичиж, тэгээд — хамгийн сайхан мөч — программаа хааж байгаад дахин нээгээд бичснээ буцааж уншина. Мөн хоёр шинэ анхааруулгатай танилцана: байхгүй файлыг уншихад гардаг FileNotFoundError, тэгээд "w" горимын нэг аюултай зан — энэ хичээлийн цорын ганц жинхэнэ "хаздаг" газар тул түүнд тусгай хэсэг зориулна.
Нэг тайвшрал урьдчилаад: өнөөдрийн бичиглэлд жинхэнэ шинэ зүйл нь ганц үг — with. Бусад нь бүгд танил хэлбэрүүд: open() бол function (дуудлага, argument, гардуулалт), f.write() бол цэгэн method (Бүлэг 9-ийн авдар), уншсан зүйл string (таны төрөлх нутаг), горимын "w", "r" бол ердөө string-argument-ууд. Өмнөх хичээлд "сэтгэлзүйн босго нь бичиглэлийн босгоноосоо өндөр" гэж хэлсэн — одоо шалгаж үзье.
Шүүгээний зүйрлэлээ нэг алхам гүнзгийрүүлье. Танай оффист архивч ажилладаг гэж бодъё — шүүгээг зөвхөн тэр л нээдэг журамтай. Та түүнд хүсэлт өгнө: хүсэлтэд хоёр зүйл заавал бичигдэнэ — хавтасны нэр, тэгээд юу хийх гэж байгаа нь: "уншихаар" уу, "бичихээр" үү. Яагаад хоёр дахь нь заавал вэ: уншигчид архивч хавтсыг байгаагаар нь өгдөг, харин бичигчид — анхаар — цоо шинэ хоосон хавтас бэлдэж өгдөг журамтай: хуучин ижил нэртэй хавтас байсан бол... түүний хувь заяаг доор тусгайлан ярина. Тэгээд архивчийн нэг алтан журам: хүсэлт бүр "ажил дуусмагц хавтсыг би өөрөө буцааж хийнэ" гэсэн амлалттай хамт явдаг — та хаахаа санах шаардлагагүй: журам өөрөө хариуцна. Python-д тэр "амлалттай хүсэлт" нь with гэдэг үг: with open(...) гэж эхэлсэн багц дуусмагц Python файлыг өөрөө, найдвартай хаадаг — бүр дундуур нь алдаа гарч осолдсон ч хаалт мартагддаггүй. (Python-д with-гүй, "гараар хаадаг" хуучин хэлбэр бий — бид түүнийг зориуд заахгүй: анхнаасаа зөв дадлаар — with-тэй — эхэлсэн хүнд мартагдсан хаалтын зовлон гэж байдаггүй.)
Шинэ файл үүсгэе — VS Code дээрээ shuugee.py гэсэн файлд:
python
with open("temdeglel.txt", "w") as f:
f.write("Сайн байна уу, шүүгээ!")
print("Хадгаллаа")Run дараад terminal-д "Хадгаллаа" гарна — гэхдээ жинхэнэ үйл явдал terminal-д биш: зүүн самбараа хараарай — python-hicheel хавтсанд tань temdeglel.txt гэдэг шинэ файл мэндэлжээ! Дээр нь товшвол VS Code нээж өгнө: дотор нь "Сайн байна уу, шүүгээ!" — таны программын бичсэн анхны файл. Одоо мөрөө задалъя. with — архивчийн амлалттай хүсэлтийн эхлэл: "энэ багц дуусахад хаалтыг хариуцаарай." open("temdeglel.txt", "w") — нээлтийн function: эхний argument — хавтасны нэр (өргөтгөлтэйгөө — string учраас хашилттай!), хоёр дахь нь — горим: "w" нь write — "бичихээр нээж байна" (файл байхгүй бол шинээр үүсгэнэ — сая болсон явдал яг энэ). as f — нээгдсэн хавтсыг f гэдэг нэрээр авъя гэсэн нэрлэлт: as нь "гэж нэрлэе" гэсэн үг, f нь file-ийн товчлол — давталтын i шиг тогтсон богино нэр (өөр нэр өгч болно — as hawtas ч ажиллана). Тэгээд хоёр цэг + шигдсэн бие — таны найм дахь удаагаа таарч буй хэлбэр: биеийн мөрүүд "хавтас нээлттэй байх зуурх" ажлууд: шигдэлт дуусмагц архивч хавтсыг хаана. f.write("...") — нээлттэй хавтасны авдраас write багажийг дуудав: string-ээ файлд буулгана. Гурван мөр — амласан ёсоор.
Одоо ид шидийн шалгалт: VS Code-оо бүхэлд нь хаагаад, дахин нээгээрэй. Зүүн самбарт temdeglel.txt байсаар — дотроо бичвэртэйгээ. Ширээ цэвэрлэгдэв — шүүгээ санаж үлдэв: таны программын гараар бүтсэн анхны "мартагдашгүй" зүйл энэ.
Хоёр дахь жишээ: унших — тойрог гүйцэв. Одоо урвуу зөөвөрлөлт — шүүгээнээс ширээнд:
python
with open("temdeglel.txt", "r") as f:
aguulga = f.read()
print(aguulga)
print(len(aguulga))Үр дүн:
Сайн байна уу, шүүгээ!
22Өөрчлөгдсөн нь хоёрхон зүйл: горим "r" (read — уншихаар), тэгээд write-ийн оронд f.read() — "хавтасны бүх агуулгыг уншаад гардуул": гардуулдаг тогооч! — тиймээс хариуг нь aguulga хайрцганд хадгалав (хадгалахгүй бол — type()-ийн ганцаардсан асуултын хувь заяа: агаарт замхарна). Гардуулалт нь юу вэ — string: len ажиллаж 22 гэж тоолсон нь нотолгоо (тоолж үзээрэй — зай, анхаарын тэмдэгтэйгээ 22 тэмдэгт). Энэ мөчөөс эхлэн файлын агуулга таны бүрэн эрхт string: upper() дуудна, in-ээр хайна, split()-ээр задална, f-string-ийн нүхэнд суулгана — Бүлэг 5, 9-ийн бүх зэвсэг файлын агуулган дээр ажиллана. Уншилт биеийн гадна print хийж байгааг ажигла: aguulga ширээн дээр (санах ойд) хуулагдчихсан тул хавтас хаагдсан ч түүнтэй ажиллаж болно — "шүүгээнээс ширээндээ хуулж аваад, хавтсаа буцааж хийчихээд, ширээн дээрээ тайван ажиллах" — зөв дэг журам яг энэ.
Гурав дахь жишээ: олон мөр бичих — \n эргэн ирэв. Нэг мөрөөс олон мөр рүү:
python
with open("nom.txt", "w") as f:
f.write("Хөх толбо\n")
f.write("Тунгалаг Тамир\n")
f.write("Монголын нууц товчоо\n")
with open("nom.txt", "r") as f:
aguulga = f.read()
print(aguulga)Үр дүн:
Хөх толбо
Тунгалаг Тамир
Монголын нууц товчооХоёр шинэ ажиглалт. Нэг: write шинэ мөр өөрөө нэмдэггүй — print шиг биш: гурван write-ийг \n-гүйгээр бичсэн бол гурван нэр нэг мөрөнд наалдах байсан ("Хөх толбоТунгалаг Тамир...") — тиймээс мөр бүрийн төгсгөлд \n (харилцагчийн дэвтрийн цэснээс таньдаг "шинэ мөр" тэмдэгт) гараар залгаж байна: файлын мөрүүд бол үнэндээ "нэг урт string доторх \n-ээр таслагдсан хэсгүүд" юм. Хоёр: нэг программд хоёр with дараалж байна — эхнийх бичээд хаав, хоёр дахь нь нээгээд уншив: with бүр өөрийн бүтэн "нээх-ажиллах-хаах" тойрог — ингэж дараалуулах нь бүрэн хэвийн.
Дөрөв дэх жишээ: "w"-гийн аюултай зан — арчигч. Одоо амласан тусгай хэсэг. Дээрх nom.txt-тэйгээ үргэлжлүүлье:
python
with open("nom.txt", "w") as f:
f.write("Шинэ ном\n")
with open("nom.txt", "r") as f:
print(f.read())Үр дүн:
Шинэ номГурван ном чинь хаачив?! Арчигдав — асуултгүйгээр, буцалтгүйгээр. Энэ бол "w" горимын мөн чанар: архивчийн журмыг саная — "бичихээр" ирсэн хүнд цоо шинэ хоосон хавтас: ижил нэртэй хуучин хавтас байсан бол түүний агуулга бүрэн хаягдаад хоосноос эхэлдэг. Мэдэгдэл ч гарахгүй, "итгэлтэй байна уу?" гэж ч асуухгүй — Бүлэг 4-ийн "шинэ утга хуучныг дардаг" дүрмийн файл-хувилбар, гэхдээ энд дарагдаж буй нь нэг variable биш — магадгүй таны олон өдрийн өгөгдөл. Тэгвэл "хуучин дээр нэмж бичье" гэвэл? Түүнд зориулсан гурав дахь горим бий: "a" — append (залгах: list-ийн append-тэй нэг үг, нэг санаа!) — "a"-гаар нээхэд архивч хуучин хавтсыг байгаагаар нь өгч, таны бичсэн бүхэн төгсгөлд нь залгагдана:
python
with open("nom.txt", "a") as f:
f.write("Бас нэг ном\n")Одоо уншвал: "Шинэ ном" ба "Бас нэг ном" — хоёул байна. Гурван горимоо нэг мөрөнд эмхэлье: "r" — унших (файл байх ёстой), "w" — тэглээд бичих (байхгүй бол үүсгэнэ, байгаа бол арчина), "a" — төгсгөлд нь залгах (байхгүй бол үүсгэнэ, байгааг хамгаална). Сонголтын дүрэм: "хуучин агуулга надад хэрэгтэй юу?" — хэрэгтэй бол "a", "энэ удаагийнх нь л үнэн" бол "w". Тэмдэглэл, бүртгэл хөтөлдөг программд бараг үргэлж "a" зохино — маргаашийн төсөл дээр яг үүнийг хэрэглэнэ.
Хүсвэл туршаад үзээрэй: өөрийн гурван мөрөөр (нэр, хот, дуртай хоол) tanilts.txt файл бичээд, уншиж хэвлээд, тэгээд File Explorer-оор очиж Notepad-аар нээж үзээрэй — программын чинь бүтээл "жинхэнэ" файл гэдгийг Python-ы гаднаас нотлох сайхан мөч. Сонирхвол уншсан агуулгаа split("\n") хийж үзээрэй (split-д "юугаар таслахаа" argument-аар өгч болдог!) — мөрүүд чинь list болон задарна: "файлын мөр бүрээр loop хийх" замын эхлэл — маргаашийн төслийн амттан.
Алдаа 1: FileNotFoundError — байхгүй хавтас нэхэх. Өнөөдрийн шинэ танил:
python
with open("baihgui.txt", "r") as f:
aguulga = f.read()Python:
FileNotFoundError: [Errno 2] No such file or directory: 'baihgui.txt'Орчуулбал: "FileNotFoundError (файл олдсонгүйн алдаа): ийм файл, хавтас алга: 'baihgui.txt'" — архивч шүүгээгээ ухаад тийм шошготой хавтас олсонгүй. ([Errno 2] гэдэг нь үйлдлийн системийн дотоод дугаарлалт — үл ойшоож болно: танд хэрэгтэй нь нэр ба хашилтан дахь файлын нэр.) Зөвхөн "r" горимд гардаг гэдгийг ажигла: унших гэж байгаа зүйл заавал байх ёстой — харин "w", "a" байхгүйг үүсгэчихдэг тул энэ алдаагүй. Түгээмэл гурван шалтгаан: файлын нэрний үсгийн алдаа (temdegle.txt ← temdeglel.txt — мэдэгдэл нэрийг хашилтанд үзүүлдэг: тулга!), өргөтгөл мартагдсан (open("temdeglel") — .txt-гүй бол өөр нэр!), тэгээд анхны гүйлтийн асуудал: программ чинь "уншаад эхэлдэг" бол хамгийн анхны удаад файл нь угаасаа байхгүй — энэ бол Бүлэг 11-ийн шалгуураар яг "засаж чадахгүй, гадаад ертөнцийн" алдаа: тор татна! — try: уншилт except FileNotFoundError: "анх удаа ажиллаж байна — хоосноос эхэлье" — энэ хэв маягийг маргаашийн төсөл ёсоор нь хэрэглэнэ.
Алдаа 2: "w"-гээр нээгээд унших (эсвэл урвуугаар). Горим ба үйлдэл зөрвөл:
python
with open("temdeglel.txt", "w") as f:
aguulga = f.read()Python:
io.UnsupportedOperation: not readableОрчуулбал: "уншигдахгүй" — "бичихээр" нээсэн хавтаснаас унших гэж оролдов: архивч "чи бичихээр ирсэн биз дээ" гэж буцаав. (io.UnsupportedOperation гэдэг урт нэр нь шинэ боловч уншлага нь хуучин дүрмээрээ: сүүлчийн мөр, хоёр цэгийн хойдох — not readable.) Урвуу нь ч мөн: "r"-ээр нээгээд write хийвэл not writable. Гэхдээ энэ алдааны жинхэнэ хор нь мэдэгдэлд нь биш — дээрх кодын аль хэдийн учруулсан хохиролд: "w" нээлт болмогц файл чинь арчигдчихсан — унших гэж байсан агуулга чинь алдаа гарахаас өмнө алга болсон байгаа юм! "Уншья гэснээ w гэж бичих" бол ганц үсгээр өгөгдөл алддаг хамгийн гашуун бичиглэлийн алдаа. Хамгаалах дадал: open бичих бүрдээ горимоо дуут уншиж тулга — "би одоо юу хийх гэж байна: уншина — r, тэглэж бичнэ — w, залгана — a" — гурван үсэгт гурван секунд.
Алдаа 3: Хавтас хаагдсан хойно нь хэрэглэх гэж оролдох. With-ийн хилийг мартвал:
python
with open("temdeglel.txt", "r") as f:
pass
aguulga = f.read()(pass гэдэг нь "юу ч хийхгүй" гэсэн Python-ы хоосон зогсогч үг — биеэ хоосон орхиж болдоггүй тул түр амлагч: энд "биед юу ч хийгээгүй" байдлыг үзүүлэх зорилготой.) Python:
ValueError: I/O operation on closed file.Орчуулбал: "хаагдсан файл дээр оролт-гаралтын үйлдэл хийв" — with-ийн бие дуусмагц архивч хавтсаа буцааж хийчихсэн: гадна нь f.read() гэхэд "хавтас шүүгээндээ байна шүү дээ" гэж буцаав. Дүрэм нь шигдэлтийн танил хууль: файлтай хийх бүх ажил with-ийн биед — биеэс гарахдаа агуулгаа string болгож variable-д "авч гарсан" бай (хоёр дахь жишээний дэг журам: уншиж хуулаад — гараад — ширээндээ ажилла). F нь биеийн гадна NameError биш ValueError өгч байгаа нь бас нэг нюанс: f гэдэг нэр байсаар (with түүнийг устгадаггүй) — гэхдээ заадаг хавтас нь хаалттай: "нэр амьд, эрх нь дууссан" байдал.
with open("нэр.txt", "горим") as f: — амлалттай нээлт: биеийн ажил дуусмагц Python файлыг өөрөө найдвартай хаана; файлтай хийх бүх ажил биед нь.
Гурван горим: "r" — унших (байхгүй бол FileNotFoundError — анхны гүйлтэд try/except-ээр угт), "w" — тэглээд бичих (байгааг асуултгүй арчина!), "a" — төгсгөлд залгах (хуучныг хамгаална); сонголт: "хуучин агуулга хэрэгтэй юу?"
f.write(string) — бичнэ (шинэ мөрийг \n-ээр өөрөө залга); f.read() — бүх агуулгыг нэг string болгож гардуулна: хадгалаад ширээн дээрээ бүх string-зэвсгээрээ ажилла.
"w" ба унших андуурал ганц үсгээр өгөгдөл арчдаг — open бичих бүрдээ горимоо дуут тулгах гурван секундын дадал.
Таны программ анх удаа "мартдаггүй" зүйл бүтээв: программ хаагдсан ч temdeglel.txt шүүгээнд үлдсэн — ширээ цэвэрлэгддэг, шүүгээ санадаг.
Дараагийн хичээл бол энэ бүлгийн баяр: "Тэмдэглэлийн дэвтэр" — хамтдаа бүтээх бяцхан төсөл: тэмдэглэл бичихэд файлд хадгалагддаг, программыг хаагаад дахин нээхэд хуучин тэмдэглэлүүд угтдаг программ. "Өгөгдөл чинь программын үхлийг давж гарлаа" гэдэг мөчийг бид тэнд ёслол төгөлдөр тэмдэглэнэ — тэгээд харилцагчийн дэвтэрт өгсөн амлалт руугаа нэг алхам ойртоно.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.