Ачааллж байна...
Өмнөх хоёр хичээлд бид JSON-ыг үзсэн — программууд хоорондоо ярих хэл. Одоо өөр нэг формат руу орно: CSV.
CSV гэдэг нь Comma-Separated Values буюу "таслалаар тусгаарлагдсан утгууд" гэсэн үгсийн товчлол юм. Тэр нь JSON-оос хамаагүй ЭНГИЙН: зөвхөн мөр, багана, таслал. Үүрлэлт байхгүй, төрөл байхгүй, бүтэц байхгүй.
Тэгвэл яагаад CSV-г сурах хэрэгтэй вэ, хэрэв JSON нь илүү хүчирхэг бол?
Хариулт нь нэг үгээр: Excel.
CSV бол хүснэгтийн ертөнцийн хэл юм. Excel, Google Sheets, дэлгүүрийн систем, банкны хуулга, судалгааны өгөгдөл — эдгээр бүгд CSV гаргадаг, CSV уншдаг. Хэрэв та бодит ажлын өгөгдөлтэй ажиллах гэж байгаа бол — тэр өгөгдөл маш их магадлалтайгаар CSV хэлбэрээр ирнэ.
Энэ хичээл дуусахад та CSV файл унших, бичих, мөн Excel-тэй ажиллахад гарах МОНГОЛ ТЕКСТИЙН нарийн асуудлыг шийдэж чадна. Тэр асуудал нь ердийн encoding="utf-8" -ээс арай илүү нарийн бөгөөд түүнийг мэдэхгүй бол Excel таны файлыг нээхэд кирилл үсэг эвдэрнэ.
JSON ба CSV-гийн ялгааг ойлгохын тулд хоёр өөр зүйлийг харьцуулъя.
JSON бол МОД. Мөчир дотор мөчир, дотор нь дахин мөчир. Сурагч дотор хичээлүүдийн жагсаалт, дотор нь дахин мэдээлэл. Гүн нь хязгааргүй.
CSV бол ХҮСНЭГТ. Мөр ба багана. Тэр л болоо. Хүснэгтийн нүд дотор өөр хүснэгт байж чадахгүй.
ner,nas,angi
Болд,16,10а
Сараа,17,10б
Төмөр,16,10аЭнэ бол бүтэн CSV файл. Эхний мөр нь толгой (header) — багануудын нэрс. Дараагийн мөр бүр нь нэг бичлэг (record).
Excel-д нээвэл яг ийм харагдана:
ner | nas | angi |
|---|---|---|
Болд | 16 | 10а |
Сараа | 17 | 10б |
Төмөр | 16 | 10а |
Энгийн, ойлгомжтой, хязгаарлагдмал.
Хязгаарлалт нь чухал: сурагч бүрд хичээлүүдийн ЖАГСААЛТ хадгалахыг хүсвэл — CSV чадахгүй. Нүд дотор жагсаалт байж болохгүй. Тэгэхээр та эсвэл жагсаалтыг нэг string болгож нийлүүлнэ ("математик;физик"), эсвэл өөр файл үүсгэнэ, эсвэл JSON рүү шилжинэ.
Дүрэм: өгөгдөл нь ХАВТГАЙ (хүснэгт хэлбэртэй) бол CSV. ҮҮРЛЭСЭН бол JSON.
Бэлтгэл: шинэ хавтас, venv идэвхжүүлээд, main.py бэлдээрэй.
Эхлээд VS Code-оор suragchid.csv нэртэй файл үүсгэж, дараах агуулгыг хийнэ үү:
ner,nas,angi
Болд,16,10а
Сараа,17,10б
Төмөр,16,10аАнзаараарай: хашилт байхгүй, зай байхгүй, зөвхөн таслал. Энэ бол хамгийн энгийн CSV.
python
# main.py
import csv
with open("suragchid.csv", "r", encoding="utf-8", newline="") as f:
unshigch = csv.reader(f)
for mur in unshigch:
print(mur)['ner', 'nas', 'angi']
['Болд', '16', '10а']
['Сараа', '17', '10б']
['Төмөр', '16', '10а']Кодыг задалъя.
import csv — json -той адил, Python-той хамт ирдэг модуль. Суулгах шаардлагагүй.
newline="" — шинэ keyword argument. Энэ нь open() -д зориулагдсан бөгөөд CSV файлтай ажиллахад ЗААВАЛ хэрэгтэй. Түүнгүйгээр Windows дээр мөр бүрийн хооронд ХООСОН мөр орж ирдэг. Яагаад гэдгийг тайлбарлах нь техникийн (Windows нь мөр төгсгөх тэмдэгтийг өөрөөр боловсруулдаг), гэхдээ шийдэл нь энгийн: CSV файл нээх бүрд newline="" бич.
csv.reader(f) — файлыг мөр мөрөөр нь уншиж, тус бүрийг ЖАГСААЛТ болгож өгдөг объект үүсгэнэ.
for mur in unshigch: — loop эргэх бүрд mur нь НЭГ мөрийн жагсаалт болно.
Одоо ХОЁР чухал зүйлийг анзаараарай.
Нэгдүгээрт, толгой мөр нь энгийн мөр шиг ирсэн. ['ner', 'nas', 'angi'] нь өгөгдөл биш, багануудын нэрс. csv.reader нь тэднийг ялгадаггүй — та өөрөө боловсруулах хэрэгтэй.
Хоёрдугаарт, БҮХ утга нь STRING болсон. '16' гэдгийг хараарай — хашилтанд байна. CSV-д ТӨРӨЛ гэж байхгүй. Файл нь зөвхөн текст тул бүх зүйл string болж ирнэ.
Энэ бол JSON-той харьцуулахад хамгийн том ялгаа. JSON-д 16 нь тоо байсан, буцааж уншихад тоо хэвээрээ. CSV-д 16 нь ЗҮГЭЭР Л ТЕКСТ. Хэрэв танд тоо хэрэгтэй бол өөрөө хувиргах хэрэгтэй.
python
import csv
with open("suragchid.csv", "r", encoding="utf-8", newline="") as f:
unshigch = csv.reader(f)
tolgoi = next(unshigch) # эхний мөрийг тусад нь ав
print(f"Багана: {tolgoi}")
for mur in unshigch: # үлдсэн мөрүүд
ner = mur[0]
nas = int(mur[1]) # ГАРААР хувирга
angi = mur[2]
print(f"{ner}, {nas} настай, {angi} анги")Багана: ['ner', 'nas', 'angi']
Болд, 16 настай, 10а анги
Сараа, 17 настай, 10б анги
Төмөр, 16 настай, 10а ангиnext(unshigch) нь "дараагийн нэг мөрийг ав" гэсэн үг — эхний мөр буюу толгойг авч, loop-оос ГАРГАЖ байна. Дараа нь loop нь зөвхөн бодит өгөгдөл дээр ажиллана.
int(mur[1]) — гараар хувиргалт. CSV-тэй ажиллах бүрд та үүнийг хийх хэрэгтэй болно.
Дээрх код ажиллаж байна, гэхдээ mur[0], mur[1], mur[2] гэсэн бичлэг нь МУУ. Бүлэг 5.4-ийн сургамжийг санаж байна уу? "Хэрэв элемент бүр өөр утгатай бол index биш, НЭР ашигла."
csv модульд яг үүнд зориулсан хэрэгсэл бий: DictReader.
python
import csv
with open("suragchid.csv", "r", encoding="utf-8", newline="") as f:
unshigch = csv.DictReader(f)
for mur in unshigch:
print(mur){'ner': 'Болд', 'nas': '16', 'angi': '10а'}
{'ner': 'Сараа', 'nas': '17', 'angi': '10б'}
{'ner': 'Төмөр', 'nas': '16', 'angi': '10а'}Мөр бүр нь DICTIONARY болж ирлээ.
DictReader нь эхний мөрийг АВТОМАТААР толгой гэж үзэж, түүний утгуудыг key болгож ашигладаг. Та next() бичих шаардлагагүй, index тоолох шаардлагагүй.
Одоо код нь хамаагүй тод болно:
python
import csv
with open("suragchid.csv", "r", encoding="utf-8", newline="") as f:
unshigch = csv.DictReader(f)
for mur in unshigch:
ner = mur["ner"]
nas = int(mur["nas"])
angi = mur["angi"]
print(f"{ner}, {nas} настай, {angi} анги")Болд, 16 настай, 10а анги
Сараа, 17 настай, 10б анги
Төмөр, 16 настай, 10а ангиmur["nas"] гэсэн код нь mur[1] -ээс хамаагүй тод. Мөн хэрэв багануудын дараалал өөрчлөгдвөл (жишээ нь Excel-д баганыг зөөвөл) — таны код АЖИЛЛАСААР байна, учир нь тэр нэрээр ханддаг, байрлалаар биш.
Практик дүрэм: CSV уншихдаа ҮРГЭЛЖ DictReader ашигла. csv.reader нь зөвхөн тусгай тохиолдолд (толгойгүй файл, эсвэл маш их өгөгдөл дээр хурд чухал үед) хэрэгтэй.
Ихэнхдээ та бүх өгөгдлийг санах ойд ачаалж, дараа нь боловсруулахыг хүсдэг. Бүлэг 5-ын мэдлэг ажиллаж эхэлнэ.
python
import csv
def csv_achaalakh(zam: str) -> list[dict[str, str]]:
with open(zam, "r", encoding="utf-8", newline="") as f:
unshigch = csv.DictReader(f)
return list(unshigch)
suragchid = csv_achaalakh("suragchid.csv")
print(suragchid)
print(f"Нийт: {len(suragchid)} сурагч")[{'ner': 'Болд', 'nas': '16', 'angi': '10а'}, {'ner': 'Сараа', 'nas': '17', 'angi': '10б'}, {'ner': 'Төмөр', 'nas': '16', 'angi': '10а'}]
Нийт: 3 сурагчlist(unshigch) нь бүх мөрийг нэг дор жагсаалт болгож цуглуулна.
Одоо бүтэц нь list[dict[str, str]] — dictionary-уудын жагсаалт. Танил харагдаж байна уу? Энэ бол Бүлэг 5.3-ын үүрлэсэн бүтэц, JSON-оос ирдэг ижил хэлбэр.
Тиймээс Бүлэг 5-ын бүх мэдлэг шууд ажиллана:
python
# Шүүх
angi_10a = [s for s in suragchid if s["angi"] == "10а"]
print([s["ner"] for s in angi_10a])
# Эрэмбэлэх (нас нь STRING тул int() хэрэгтэй!)
nasnaas = sorted(suragchid, key=lambda s: int(s["nas"]), reverse=True)
print([s["ner"] for s in nasnaas])
# Дундаж
dundaj = sum(int(s["nas"]) for s in suragchid) / len(suragchid)
print(f"Дундаж нас: {dundaj:.1f}")['Болд', 'Төмөр']
['Сараа', 'Болд', 'Төмөр']
Дундаж нас: 16.3int(s["nas"]) гэсэн хувиргалт хаа сайгүй байгааг анзаараарай. Энэ бол CSV-гийн байнгын ядаргаа: бүх зүйл string тул тоон үйлдэл хийх бүрд хувиргах хэрэгтэй.
Илүү цэвэрхэн арга: ачаалах үедээ НЭГ УДАА хувирга.
python
import csv
def csv_achaalakh(zam: str) -> list[dict[str, str | int]]:
ur_dun: list[dict[str, str | int]] = []
with open(zam, "r", encoding="utf-8", newline="") as f:
unshigch = csv.DictReader(f)
for mur in unshigch:
ur_dun.append({
"ner": mur["ner"],
"nas": int(mur["nas"]),
"angi": mur["angi"],
})
return ur_dun
suragchid = csv_achaalakh("suragchid.csv")
dundaj = sum(s["nas"] for s in suragchid) / len(suragchid)
print(f"Дундаж нас: {dundaj:.1f}")Дундаж нас: 16.3Одоо int() нь ганц газарт л байна. Үлдсэн бүх код нь цэвэрхэн.
Энэ бол чухал хэв маяг: CSV ачаалах функц нь зөвхөн уншаад зогсохгүй, төрлүүдийг ЗӨВ болгож хувиргах ёстой. Түүнийг бүрхүүл (wrapper) эсвэл цэвэрлэх давхарга гэж бодоорой.
Одоо эсрэг чиглэл — Python-ы өгөгдлийг CSV файл болгож бичье.
python
import csv
suragchid: list[dict[str, str | int]] = [
{"ner": "Болд", "nas": 16, "angi": "10а"},
{"ner": "Сараа", "nas": 17, "angi": "10б"},
{"ner": "Цэцэг", "nas": 16, "angi": "10в"},
]
with open("garalt.csv", "w", encoding="utf-8", newline="") as f:
baganuud = ["ner", "nas", "angi"]
bichigch = csv.DictWriter(f, fieldnames=baganuud)
bichigch.writeheader()
bichigch.writerows(suragchid)
print("Хадгаллаа.")Хадгаллаа.garalt.csv файлыг VS Code-оор нээж хараарай:
ner,nas,angi
Болд,16,10а
Сараа,17,10б
Цэцэг,16,10вКодыг задалъя.
csv.DictWriter(f, fieldnames=baganuud) — бичигч үүсгэнэ. fieldnames нь ЗААВАЛ хэрэгтэй keyword argument — тэр нь баганы нэрс, БАС дараалал юм.
bichigch.writeheader() — толгой мөрийг бичнэ (ner,nas,angi). Хэрэв энэ мөрийг орхивол файл толгойгүй болно, дараа нь DictReader -ээр уншихад эхний ӨГӨГДЛИЙН мөрийг толгой гэж үзнэ — өгөгдөл алдагдана.
bichigch.writerows(suragchid) — БҮХ мөрийг нэг дор бичнэ. Нэг мөр бичихэд writerow(mur) (ганц тоо) ашиглана.
Анзаараарай: тоонууд (16, 17) нь автоматаар текст болж бичигдсэн. CSV-д төрөл байхгүй тул хувиргалт нь автоматаар явна.
Одоо энэ хичээлийн хамгийн ЧУХАЛ, хамгийн практик хэсэг рүү орно.
Дээр үүсгэсэн garalt.csv файлыг Excel-ээр нээж үзээрэй (файл дээр хоёр удаа дарна).
Юу харагдах вэ?
ner,nas,angi
Болд,16,10а
Сараа,17,10бКирилл үсэг ЭВДЭРСЭН.
Гэхдээ VS Code-д нээхэд зөв харагдаж байсан шүү дээ! Тэгвэл яагаад Excel эвдэж байна вэ?
Учир нь Excel нь UTF-8 файлыг автоматаар танихгүй. Тэр нь Windows-ийн хуучин, орон нутгийн кодчлолыг таамаглаж, түүгээр уншиж, эвдэж байна.
Энэ бол Python-ы алдаа биш. Таны файл ЗӨВ бичигдсэн. Excel л буруу уншиж байна.
Шийдэл: encoding="utf-8-sig".
python
import csv
suragchid: list[dict[str, str | int]] = [
{"ner": "Болд", "nas": 16, "angi": "10а"},
{"ner": "Сараа", "nas": 17, "angi": "10б"},
]
with open("garalt.csv", "w", encoding="utf-8-sig", newline="") as f:
bichigch = csv.DictWriter(f, fieldnames=["ner", "nas", "angi"])
bichigch.writeheader()
bichigch.writerows(suragchid)
print("Хадгаллаа.")Одоо Excel-ээр нээж үзээрэй:
ner | nas | angi |
|---|---|---|
Болд | 16 | 10а |
Сараа | 17 | 10б |
Зөв харагдаж байна.
utf-8-sig гэдэг нь юу вэ? Тэр нь ердийн UTF-8, гэхдээ файлын ЭХЭНД жижиг, үл үзэгдэх тэмдэглэгээ нэмдэг. Тэр тэмдэглэгээг BOM (Byte Order Mark) гэж нэрлэдэг. Түүний цорын ганц үүрэг нь: "Сайн байна уу, би UTF-8 файл байна" гэж Excel-д хэлэх.
Excel тэр тэмдэглэгээг харвал зөв уншина. VS Code, Python — бүгд түүнийг үл тоомсорлож, ердийн UTF-8 гэж уншина. Тэгэхээр хэн ч гомдохгүй.
Практик дүрэм:
CSV файлыг Excel-д нээх магадлалтай бол →
encoding="utf-8-sig".
Зөвхөн Python уншихад зориулагдсан бол →encoding="utf-8"хангалттай.
Эргэлзвэл utf-8-sig ашигла. Тэр нь хоёуланд нь ажиллана.
Уншихад ч мөн адил. Хэрэв Excel-ээс CSV гаргасан файлыг уншиж байгаа бол, түүнд BOM байж болно:
python
with open("excel_ees.csv", "r", encoding="utf-8-sig", newline="") as f:
unshigch = csv.DictReader(f)
for mur in unshigch:
print(mur)utf-8-sig нь унших үед BOM байвал АРИЛГАНА, байхгүй бол юу ч хийхгүй. Тиймээс аюулгүй.
Хэрэв та utf-8 -ээр уншвал, BOM-той файлын эхний баганы нэр нь эвдэрнэ:
python
{'\ufeffner': 'Болд', 'nas': '16'}Тэр \ufeff нь BOM. Дараа нь mur["ner"] гэж хандахад KeyError гарна — учир нь key нь "\ufeffner" болсон. Энэ бол маш төөрөгдүүлдэг алдаа тул utf-8-sig ашиглаж урьдчилан сэргийл.
CSV-д нэг ойлгомжгүй асуудал бий. Хэрэв утга ӨӨРӨӨ таслал агуулж байвал яах вэ?
python
import csv
baraanuud: list[dict[str, str | int]] = [
{"ner": "Ном, шинэ", "une": 15000},
{"ner": "Утас", "une": 800000},
]
with open("baraa.csv", "w", encoding="utf-8-sig", newline="") as f:
bichigch = csv.DictWriter(f, fieldnames=["ner", "une"])
bichigch.writeheader()
bichigch.writerows(baraanuud)Файлыг нээж хараарай:
ner,une
"Ном, шинэ",15000
Утас,800000csv модуль нь автоматаар хашилт нэмсэн! Учир нь Ном, шинэ гэсэн утга нь таслал агуулж байгаа тул хашилтгүй бол хоёр багана мэт харагдах байсан.
Уншихад ч бас автоматаар зөв ажиллана:
python
with open("baraa.csv", "r", encoding="utf-8-sig", newline="") as f:
for mur in csv.DictReader(f):
print(mur){'ner': 'Ном, шинэ', 'une': '15000'}
{'ner': 'Утас', 'une': '800000'}csv модуль нь энэ бүхнийг таны өмнөөс хийж байна. Яг тиймээс та CSV-г ГАРААР задлах ЁСГҮЙ.
Эхлэгчид ихэвчлэн ингэж бичдэг:
python
# БУРУУ — хэзээ ч ингэж бүү хий
with open("baraa.csv", "r", encoding="utf-8") as f:
for mur in f:
heseg = mur.strip().split(",")
print(heseg)['ner', 'une']
['"Ном', ' шинэ"', '15000']
['Утас', '800000']Эвдэрлээ. split(",") нь хашилтын дотор байгаа таслалыг ч хуваасан. Одоо Ном, шинэ нь хоёр хэсэг болжээ.
Дүрэм: CSV-г ХЭЗЭЭ Ч split(",") -ээр задалж болохгүй. ҮРГЭЛЖ csv модуль ашигла. Тэр нь хашилт, escape, олон мөртэй утга — бүх нарийн тохиолдлыг зөв боловсруулна.
JSON | CSV | |
|---|---|---|
Бүтэц | Үүрлэсэн, гүн | Хавтгай, хүснэгт |
Төрөл | Хадгалагдана (тоо → тоо) | БҮГД STRING болно |
Excel | Шууд нээгдэхгүй | Шууд нээгдэнэ |
API | Стандарт | Ховор |
Хүн засварлах | Дунд зэрэг | Хялбар (Excel) |
Файлын хэмжээ | Том (key давтагдана) | Жижиг |
JSON сонго: үүрлэсэн өгөгдөл, төрөл хадгалах хэрэгтэй, программ хоорондоо солилцох, API.
CSV сонго: хавтгай хүснэгт, Excel-тэй ажиллах, хүн засварлах, олон мөртэй энгийн өгөгдөл.
Бодит амьдрал дээр: та ихэвчлэн CSV-г ОРОЛТ болгож (Excel-ээс ирсэн), JSON-ыг ХАДГАЛАЛТ болгож (программын дотоод) ашиглана. Мөн заримдаа JSON-оос CSV гаргаж, Excel-д илгээнэ.
Практикт хамгийн түгээмэл ажил бол: Excel-ээс CSV авах, Python-оор боловсруулах, буцааж CSV гаргах.
python
import csv
def achaalakh(zam: str) -> list[dict[str, str | int]]:
ur_dun: list[dict[str, str | int]] = []
with open(zam, "r", encoding="utf-8-sig", newline="") as f:
for mur in csv.DictReader(f):
ur_dun.append({
"ner": mur["ner"],
"nas": int(mur["nas"]),
"angi": mur["angi"],
})
return ur_dun
def khadgalakh(zam: str, uguudul: list[dict[str, str | int]]) -> None:
if not uguudul:
print("Хадгалах өгөгдөл алга.")
return
baganuud = list(uguudul[0].keys())
with open(zam, "w", encoding="utf-8-sig", newline="") as f:
bichigch = csv.DictWriter(f, fieldnames=baganuud)
bichigch.writeheader()
bichigch.writerows(uguudul)
# Ачаалах
suragchid = achaalakh("suragchid.csv")
# Боловсруулах — зөвхөн 10а анги
angi_10a = [s for s in suragchid if s["angi"] == "10а"]
# Хадгалах
khadgalakh("angi_10a.csv", angi_10a)
print(f"{len(angi_10a)} сурагчийг angi_10a.csv файлд хадгаллаа.")2 сурагчийг angi_10a.csv файлд хадгаллаа.baganuud = list(uguudul[0].keys()) гэсэн мөрийг анзаараарай — эхний dictionary-гийн key-үүдээс баганы нэрсийг АВТОМАТААР гаргаж байна. Ингэснээр багануудыг гараар бичих шаардлагагүй.
if not uguudul: return — хоосон жагсаалт дээр uguudul[0] нь IndexError гаргах тул хамгаалалт. Түвшин 1-ийн guided build-ийн сургамж дахин ажиллаж байна.
Хэрэв сонирхвол: Excel (эсвэл Google Sheets) нээгээд жижиг хүснэгт үүсгэж, кирилл текст оруулаад, "CSV UTF-8" форматаар хадгалаарай. Дараа нь түүнийг Python-оор encoding="utf-8-sig" -ээр уншиж үзээрэй. Ажиллах ёстой.
Дараа нь зориудаар encoding="utf-8" (sig-гүй) -ээр уншаад, эхний баганы key нь '\ufeffner' болж эвдэрсэнийг хараарай. Тэр туршилт нь utf-8-sig -ийг хэзээ ч мартахгүй болгоно.
Мөн хүсвэл: Түвшин 1-ийн текст статистикийн хэрэгслийг өөрчилж, үгийн давтамжийг CSV файл болгож гаргадаг болгоод үзээрэй. Дараа нь тэр файлыг Excel-д нээж, диаграм зурж болно — Python ба Excel-ийн хамтын ажиллагаа.
1. newline="" мартах
python
with open("garalt.csv", "w", encoding="utf-8-sig") as f:
...Алдаа гарахгүй, гэхдээ файлд ХООСОН МӨР орж ирнэ:
ner,nas,angi
Болд,16,10а
Сараа,17,10бExcel-д нээхэд хоосон мөрүүд харагдана. Засвар: newline="" -ийг ЗААВАЛ бич — унших ба бичих хоёуланд нь.
2. Excel-д кирилл эвдрэх
Файл нь utf-8 -ээр бичигдсэн, Excel нь танихгүй. Засвар: encoding="utf-8-sig".
3. BOM-той файлыг utf-8 -ээр унших
python
{'\ufeffner': 'Болд', 'nas': '16'}Дараа нь:
KeyError: 'ner'Эхний key нь '\ufeffner' болсон. Засвар: encoding="utf-8-sig" -ээр унш.
4. Тоо гэж бодох
python
suragchid = list(csv.DictReader(f))
dundaj = sum(s["nas"] for s in suragchid) / len(suragchid)TypeError: unsupported operand type(s) for +: 'int' and 'str'unsupported operand type(s) for +: 'int' and 'str' — "тоо ба текстийг нэмж болохгүй." CSV-ээс ирсэн БҮХ утга нь string. Засвар: int(s["nas"]).
5. split(",") ашиглах
Таслал агуулсан утга дээр эвдэрнэ. ХЭЗЭЭ Ч бүү хий. csv модуль ашигла.
6. writeheader() мартах
Файл толгойгүй болно. Дараа нь DictReader -ээр уншихад эхний ӨГӨГДЛИЙН мөрийг толгой гэж үзэж, тэр бичлэг алдагдана.
7. Excel-д CSV нээгээд ХАДГАЛАХ
Excel нь CSV-г дахин хадгалахдаа өөрийн дүрмээр бичдэг — заримдаа BOM-гүй, заримдаа өөр тусгаарлагчтай (зарим улсад цэгтэй таслал!). Хэрэв Excel-ээс ирсэн файл ажиллахгүй бол — түүнийг текст засварлагчаар нээж, юу байгааг ХАРААРАЙ.
CSV (Comma-Separated Values) нь ХАВТГАЙ хүснэгтийн формат: мөр, багана, таслал. Үүрлэлт БАЙХГҮЙ.
import csv — Python-той хамт ирдэг модуль.
csv.DictReader(f) — мөр бүрийг dictionary болгож өгнө. Эхний мөрийг автоматаар толгой гэж үзнэ. Үргэлж үүнийг ашигла.
csv.DictWriter(f, fieldnames=[...]) — бичнэ. writeheader() дараа нь writerows(...).
newline="" — CSV файл нээх бүрд ЗААВАЛ. Түүнгүйгээр хоосон мөр орж ирнэ.
БҮХ утга string болж ирнэ. CSV-д төрөл байхгүй. Тоо хэрэгтэй бол int() эсвэл float() -ээр ГАРААР хувирга — ачаалах үедээ нэг удаа хийвэл дээр.
МОНГОЛ ТЕКСТИЙН ГОЛ ДҮРЭМ: Excel-д нээх магадлалтай бол encoding="utf-8-sig". Ердийн utf-8 бол Excel кирилл үсгийг эвдэнэ.
utf-8-sig нь унших үед ч аюулгүй — BOM байвал арилгана, байхгүй бол юу ч хийхгүй.
split(",") -ээр CSV задлахыг ХЭЗЭЭ Ч бүү хий. Хашилт доторх таслал дээр эвдэрнэ. csv модуль бүх нарийн тохиолдлыг зөв боловсруулна.
JSON vs CSV: үүрлэсэн, төрөл хадгалах, API → JSON. Хавтгай, Excel, хүн засварлах → CSV.
DictReader -ээс ирэх бүтэц нь list[dict[str, str]] — Бүлэг 5-ын бүх мэдлэг (comprehension, sorted, set) шууд ажиллана.
Дараагийн хичээлд бид ФАЙЛААС УНШСАН бодит өгөгдөл дээр ажиллах чадвараа бататгана: шүүх, талбар гаргаж авах, нийлбэр бодох, бүлэглэх. Тэнд шинэ бичлэг байхгүй — зөвхөн Бүлэг 2-ын comprehension, Бүлэг 3-ын sorted/lambda, Бүлэг 5-ын бүтцүүд бодит өгөгдөл дээр нийлж ажиллана. Тэр хичээл нь Түвшин 2-ын guided build (зарлагын бүртгэл) -ийн шууд бэлтгэл болно.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.