Asosiy qismga o'tish

Fayl o'qish va yozish: CSV va Excel

9-bob 8 kod bloki 1086 so'z

Bu bobdagi kod shu fayllar bilan ishlaydio'z kompyuteringizda ishga tushiring

Sahna: ma'lumot fayl bo'lib keladi

Hech kim jadvalni qo'lda yozib bermaydi. U fayl bo'lib keladi: CSV (vergul bilan ajratilgan matn), Excel, ba'zan boshqa dasturdan eksport. Bu bobda avtomobil e'lonlari faylini ochamiz va o'qishning oddiy ko'ringan, lekin keyin muammo beradigan joylarini ko'ramiz.

Kitob ma'lumotlari DATA papkada (sahifa yuqorisidan yuklab olishingiz mumkin).

read_csv: birinchi tanishuv

python5 qator
import pandas as pd

avto = pd.read_csv(DATA / "avto_savdo.csv")
print(avto.shape)
avto.head()
Chiqish
(612, 9)
elon_idsanamodelrangyilprobeg_kmuzatmaviloyatnarx
0100112.07.2025CAPTIVAQora2013NaNAvtomatToshkent123 500 000 so'm
1100215.01.2025NEXIA 3Qizil2012233862AvtomatToshkent32500000
2100301.07.2025SPARKOq202431254MexanikaNamangan93 000 000 so'm
3100408.07.2025SparkQizil2015201 112AvtomatAndijon36500000
4100507.02.2025Onix Qizil202186520MexanikaAndijon142500000

read_csv faylni o'qib, DataFrame qaytaradi. Birinchi qator — ustun nomlari (sarlavha). head() — birinchi 5 qator: katta faylni ochganda hech qachon hammasini chiqarmang.

Endi eng muhim tekshiruv — pandas har ustunni qanday tur deb tushundi:

matn1 qator
avto.dtypes
0
elon_idint64
sanaobject
modelobject
rangobject
yilint64
probeg_kmobject
uzatmaobject
viloyatobject
narxobject

Ko'zga tashlanadigan uchta narsa:

  • narx — object (matn). Faylda "45 000 000 so'm" kabi yozilgan — bo'shliq va "so'm" bor, pandas buni son deb o'qiy olmadi.
  • probeg_km — u ham object: ba'zi qatorlarda son bo'shliq bilan yozilgan.
  • sana — object: pandas sanani o'zi tanimadi.

Bu xato emas — pandas ehtiyotkor: shubhali ustunni matn sifatida qoldiradi, ma'lumot yo'qolmasin deb. Tozalash — bizning ish (12-bob). Hozir o'qish paytida tuzatsa bo'ladiganini tuzatamiz.

Sana: format aniq beriladi

python3 qator
avto = pd.read_csv(DATA / "avto_savdo.csv", parse_dates=["sana"], date_format="%d.%m.%Y")
print(avto["sana"].dtype)
print(avto["sana"].min(), "—", avto["sana"].max())
Chiqish
datetime64[ns]
2025-01-01 00:00:00 — 2025-10-27 00:00:00

Faylda sanalar 12.07.2025 — kun.oy.yil (O'zbekistonda shunday). date_format="%d.%m.%Y" — pandas ga aniq aytamiz: %d kun, %m oy, %Y to'rt xonali yil. Format bermasangiz, pandas taxmin qiladi — va 03.04.2025 ni 4-mart emas, 3-aprel deb o'qishi mumkin. Taxmin xato bo'lsa, ogohlantirish ham chiqmaydi.

Faqat keragini o'qish

Katta fayl bilan ishlaganda hammasini xotiraga yuklash shart emas:

python4 qator
kichik = pd.read_csv(DATA / "avto_savdo.csv", usecols=["model", "yil", "viloyat"], nrows=100,
                     dtype={"viloyat": "category"})
print(kichik.shape)
print(kichik.memory_usage(deep=True).round(-2).to_dict())
Chiqish
(100, 3)
{'Index': 100, 'model': 6300, 'yil': 800, 'viloyat': 900}
  • usecols — faqat shu ustunlar.
  • nrows — faqat birinchi N qator: faylni tez "hidlab ko'rish" uchun.
  • dtype={"viloyat": "category"} — takrorlanadigan matnlar uchun maxsus tur: har viloyat nomi bir marta saqlanadi, qatorlarda faqat kod. viloyat ustuni model dan ancha kam joy egallaganiga qarang.

Excel dan kelgan CSV: nuqta-vergul va vergulli kasr

O'zbek yoki rus tilidagi Windows da Excel "CSV" ni ko'pincha nuqta-vergul bilan saqlaydi, kasrni esa vergul bilan yozadi. Shunday faylni oddiy o'qisak nima bo'lishini ko'ramiz:

python7 qator
import io

excel_csv = "mahsulot;narx;soni\nNon;5000,50;3\nSut;12000,00;2\n"
print(pd.read_csv(io.StringIO(excel_csv)).shape)
togri = pd.read_csv(io.StringIO(excel_csv), sep=";", decimal=",")
print(togri.dtypes.to_dict())
togri
Chiqish
(2, 1)
{'mahsulot': dtype('O'), 'narx': dtype('float64'), 'soni': dtype('int64')}
mahsulotnarxsoni
0Non5000.53
1Sut120002

Birinchi urinish — 2 qator, 1 ustun: pandas vergul kutdi, nuqta-vergulni ajratuvchi deb bilmadi, butun qatorni bitta matn qildi. sep=";" va decimal="," bilan — to'g'ri ustunlar va haqiqiy kasr sonlar. (io.StringIO — matnni fayl o'rniga ishlatish usuli; real hayotda bu yerda fayl yo'li turadi.)

Qoida: o'qigandan keyin darhol shape va dtypes ni tekshiring. Ustunlar soni kam yoki raqamli ustun object bo'lsa — ajratuvchi yoki format noto'g'ri.

Yozish: to_csv va index tuzog'i

python5 qator
yangi = avto[["elon_id", "model", "yil"]].head(3)
yangi.to_csv(ISH / "xato.csv")
yangi.to_csv(ISH / "togri.csv", index=False)
print(pd.read_csv(ISH / "xato.csv").columns.tolist())
print(pd.read_csv(ISH / "togri.csv").columns.tolist())
Chiqish
['Unnamed: 0', 'elon_id', 'model', 'yil']
['elon_id', 'model', 'yil']

to_csv standart holda index ni ham yozadi. Qaytadan o'qiganda u nomsiz ustun bo'lib kirib keladi — Unnamed: 0. Bir necha marta saqlab-o'qisangiz, Unnamed: 0.1, Unnamed: 0.2 ko'payib boradi. Index ma'noli bo'lmasa (0, 1, 2...) — doim index=False.

Excel

python3 qator
yangi.to_excel(ISH / "e'lonlar.xlsx", index=False, sheet_name="Avto")
qaytdi = pd.read_excel(ISH / "e'lonlar.xlsx", sheet_name="Avto")
print(qaytdi.equals(yangi.reset_index(drop=True)))
Chiqish
True

to_excel / read_excel ishlashi uchun openpyxl kutubxonasi kerak (pip install openpyxl). sheet_name — qaysi varaq. Excel faylida bir nechta varaq bo'lsa, sheet_name=None hammasini lug'at qilib qaytaradi.

Bir qarashda: e'lonlar qayerdan

python2 qator
avto["viloyat"].value_counts().plot(kind="bar", color="#1a73e8", title="E'lonlar soni, viloyat bo'yicha", rot=30)
plt.show()

Fayl o'qildi — va bir qatorda birinchi savolga javob bor. Lekin ehtiyot bo'ling: hali tozalamadik. 12-bobda bu faylda takror qatorlar borligini topamiz — ular ham shu ustunlarda sanaldi.

Xulosa

  • pd.read_csv(fayl) → DataFrame; darhol shape, dtypes, head() bilan tekshiring.
  • Sana: parse_dates + aniq date_format (%d.%m.%Y) — taxminga qoldirmang.
  • Katta fayl: usecols, nrows, takrorlanuvchi matnga category.
  • Excel CSV: sep=";", decimal=",".
  • Yozish: to_csv(..., index=False), aks holda Unnamed: 0.
  • Excel: to_excel / read_excel (openpyxl bilan).

Mashqlar

  1. avto_savdo.csv ni faqat model va narx ustunlari bilan, birinchi 10 qatorni o'qing.
  2. "sana,summa\n05.03.2025,100\n06.03.2025,250" matnini sanani to'g'ri tushungan holda o'qing. Birinchi sana qaysi oy?
  3. dokon_savdo.csv ni o'qing. Nechta qator, nechta ustun? Qaysi ustunlar son emas?

Javoblar

  1. pd.read_csv(DATA / "avto_savdo.csv", usecols=["model", "narx"], nrows=10).
  2. parse_dates=["sana"], date_format="%d.%m.%Y" bilan — mart (3-oy).
  3. pd.read_csv(DATA / "dokon_savdo.csv") — 11 352 qator, 8 ustun; sana, vaqt, tolov — object.

Bu bobni bepul o'qidingiz.

Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.

Telegramda yozish Narxlar