28 / 59

Reading CSV files in Python

CSV fayllarni o'qish bilan tanishish

Biz bu vazifa uchun aynan Pythonning o'ziga o'rnatilgan csv modulidan foydalanamiz. Lekin avval, modulni quyidagicha import qilishimiz kerak:

example.py
import csv

Biz csv modulidan CSV fayllarga o'qish va yozish uchun qanday foydalanishning asoslarini allaqachon ko'rib chiqqanmiz. Agar csv modulidan foydalanish haqida hech qanday tasavvuringiz bo'lmasa, Python CSV: Read and Write CSV files darsimizni ko'rib chiqing.

csv.reader()ning asosiy qo'llanilishi

Keling, mavjud bilimingizni yangilash uchun csv.reader()dan foydalanishning oddiy misoliga qaraymiz.

1-misol: CSV fayllarni csv.reader() bilan o'qish

Aytaylik, bizda quyidagi yozuvlarga ega CSV faylimiz bor:

kod
SN,Name,Contribution
1,Linus Torvalds,Linux Kernel
2,Tim Berners-Lee,World Wide Web
3,Guido van Rossum,Python Programming

Fayl kontentini quyidagi dastur bilan o'qishimiz mumkin:

example.py
import csv
with open('innovators.csv', 'r') as file:
    reader = csv.reader(file)
    for row in reader:
        print(row)

Natija

kod
['SN', 'Name', 'Contribution']
['1', 'Linus Torvalds', 'Linux Kernel']
['2', 'Tim Berners-Lee', 'World Wide Web']
['3', 'Guido van Rossum', 'Python Programming']

Bu yerda biz open() funksiyasi yordamida innovators.csv faylini o'qish rejimida ochdik.

Pythonda fayllarni ochish haqida ko'proq bilish uchun, tashrif buyuring: Python File Input/Output

Keyin, csv.reader() faylni o'qish uchun ishlatiladi, u aylanib chiqish mumkin bo'lgan (iterable) reader obyektini qaytaradi.

Keyin, reader obyekti har bir qatorning kontentini chop etish uchun for sikli yordamida aylanib chiqiladi.

Endi, biz turli formatdagi CSV fayllarni ko'rib chiqamiz. Keyin ularni o'qish uchun csv.reader() funksiyasini qanday moslashtirishni o'rganamiz.

Maxsus ajratuvchiga (Delimiter) ega CSV fayllar

Standart holatda, CSV faylida ajratuvchi sifatida vergul ishlatiladi. Biroq, ba'zi CSV fayllar vergul o'rniga boshqa ajratuvchilardan foydalanishi mumkin. Bir nechta mashhurlari — | va \t.

Aytaylik, 1-misoldagi innovators.csv fayli ajratuvchi sifatida tab (\t)dan foydalangan. Faylni o'qish uchun, csv.reader() funksiyasiga qo'shimcha delimiter parametrini uzatishimiz mumkin.

Keling, bir misol ko'ramiz.

2-misol: Tab ajratuvchiga ega CSV faylni o'qish

example.py
import csv
with open('innovators.csv', 'r') as file:
    reader = csv.reader(file, delimiter = '\t')
    for row in reader:
        print(row)

Natija

kod
['SN', 'Name', 'Contribution']
['1', 'Linus Torvalds', 'Linux Kernel']
['2', 'Tim Berners-Lee', 'World Wide Web']
['3', 'Guido van Rossum', 'Python Programming']

Ko'rib turganimizdek, ixtiyoriy delimiter = '\t' parametri reader obyektiga biz o'qiyotgan CSV faylida ajratuvchi sifatida tablar ishlatilganini belgilashga yordam beradi.

Boshida bo'sh joyga ega CSV fayllar

Ba'zi CSV fayllarda ajratuvchidan keyin bo'sh joy belgisi bo'lishi mumkin. Bunday CSV fayllarni o'qish uchun standart csv.reader() funksiyasidan foydalansak, natijada bo'sh joylarni ham olamiz.

Bu boshlang'ich bo'sh joylarni olib tashlash uchun, skipinitialspace nomli qo'shimcha parametrni uzatishimiz kerak. Keling, bir misolga qaraymiz:

3-misol: Boshida bo'sh joyga ega CSV fayllarni o'qish

Aytaylik, bizda quyidagi kontentga ega people.csv nomli CSV faylimiz bor:

kod
SN, Name, City
1, John, Washington
2, Eric, Los Angeles
3, Brad, Texas

CSV faylni quyidagicha o'qishimiz mumkin:

example.py
import csv
with open('people.csv', 'r') as csvfile:
    reader = csv.reader(csvfile, skipinitialspace=True)
    for row in reader:
        print(row)

Natija

kod
['SN', 'Name', 'City']
['1', 'John', 'Washington']
['2', 'Eric', 'Los Angeles']
['3', 'Brad', 'Texas']

Dastur boshqa misollarga o'xshaydi, lekin Truega o'rnatilgan qo'shimcha skipinitialspace parametriga ega.

Bu reader obyektiga yozuvlar boshlang'ich bo'sh joyga ega ekanligini bilish imkonini beradi. Natijada, ajratuvchidan keyin mavjud bo'lgan boshlang'ich bo'sh joylar olib tashlanadi.

Qo'shtirnoqli CSV fayllar

Ba'zi CSV fayllarda har bir yoki ba'zi yozuvlar atrofida qo'shtirnoq bo'lishi mumkin.

Keling, quotes.csvni quyidagi yozuvlar bilan misol sifatida olamiz:

kod
"SN", "Name", "Quotes"
1, Buddha, "What we think we become"
2, Mark Twain, "Never regret anything that made you smile"
3, Oscar Wilde, "Be yourself everyone else is already taken"

csv.reader()dan minimal rejimda foydalanish qo'shtirnoq belgilari bilan natija beradi.

Ularni olib tashlash uchun, quoting nomli boshqa ixtiyoriy parametrdan foydalanishimiz kerak bo'ladi.

Keling, yuqoridagi dasturni qanday o'qishga misol ko'ramiz.

4-misol: Qo'shtirnoqli CSV fayllarni o'qish

example.py
import csv
with open('person1.csv', 'r') as file:
    reader = csv.reader(file, quoting=csv.QUOTE_ALL, skipinitialspace=True)
    for row in reader:
        print(row)

Natija

kod
['SN', 'Name', 'Quotes']
['1', 'Buddha', 'What we think we become']
['2', 'Mark Twain', 'Never regret anything that made you smile']
['3', 'Oscar Wilde', 'Be yourself everyone else is already taken']

Ko'rib turganingizdek, biz quoting parametriga csv.QUOTE_ALLni uzatdik. Bu csv moduli tomonidan aniqlangan konstanta.

csv.QUOTE_ALL reader obyektiga CSV fayldagi barcha qiymatlar qo'shtirnoq ichida mavjudligini belgilaydi.

quoting parametriga uzatishingiz mumkin bo'lgan yana 3 ta oldindan belgilangan konstanta bor:

  • csv.QUOTE_MINIMAL - reader obyektiga CSV faylida faqat ajratuvchi, qo'shtirnoq belgisi yoki lineterminator'dagi biror belgi kabi maxsus belgilarni o'z ichiga olgan yozuvlar atrofida qo'shtirnoq borligini belgilaydi.
  • csv.QUOTE_NONNUMERIC - reader obyektiga CSV faylida son bo'lmagan yozuvlar atrofida qo'shtirnoq borligini belgilaydi.
  • csv.QUOTE_NONE - reader obyektiga hech qanday yozuv atrofida qo'shtirnoq yo'qligini belgilaydi.

CSV modulida dialektlar (Dialects)

4-misolda, biz csv.reader() funksiyasiga bir nechta parametrni (quoting va skipinitialspace) uzatganimizga e'tibor bering.

Bu amaliyot bitta yoki ikkita fayl bilan ishlaganda maqbul. Lekin biz o'xshash formatdagi bir nechta CSV fayllar bilan ishlay boshlaganimizda, bu kodni ortiqcha va xunuk qiladi.

Buning yechimi sifatida, csv moduli dialect (dialekt)ni ixtiyoriy parametr sifatida taklif etadi.

Dialekt delimiter, skipinitialspace, quoting, escapechar kabi ko'plab muayyan formatlash parametrlarini bitta dialekt nomiga birlashtirishga yordam beradi.

So'ngra u bir nechta writer yoki reader nusxalariga parametr sifatida uzatilishi mumkin.

5-misol: Dialekt yordamida CSV fayllarni o'qish

Aytaylik, bizda quyidagi kontentga ega CSV faylimiz (office.csv) bor:

kod
"ID"| "Name"| "Email"
"A878"| "Alfonso K. Hamby"| "alfonsokhamby@rhyta.com"
"F854"| "Susanne Briard"| "susannebriard@armyspy.com"
"E833"| "Katja Mauer"| "kmauer@jadoop.com"

CSV faylida boshlang'ich bo'sh joylar bor, har bir yozuv atrofida qo'shtirnoq bor va | ajratuvchisi ishlatilgan.

Uchta alohida formatlash parametrini uzatish o'rniga, keling, bu faylni o'qish uchun dialektlardan qanday foydalanishga qaraymiz.

example.py
import csv
csv.register_dialect('myDialect',
                     delimiter='|',
                     skipinitialspace=True,
                     quoting=csv.QUOTE_ALL)

with open('office.csv', 'r') as csvfile:
    reader = csv.reader(csvfile, dialect='myDialect')
    for row in reader:
        print(row)

Natija

kod
['ID', 'Name', 'Email']
["A878", 'Alfonso K. Hamby', 'alfonsokhamby@rhyta.com']
["F854", 'Susanne Briard', 'susannebriard@armyspy.com']
["E833", 'Katja Mauer', 'kmauer@jadoop.com']

Bu misoldan ko'rishimiz mumkinki, csv.register_dialect() funksiyasi maxsus dialektni aniqlash uchun ishlatiladi. Uning sintaksisi quyidagicha:

kod
csv.register_dialect(name[, dialect[, **fmtparams]])

Maxsus dialekt satr ko'rinishida nomga ega bo'lishi kerak. Boshqa spetsifikatsiyalar Dialect klassining kichik klassini (sub-class) uzatish orqali yoki misolda ko'rsatilganidek, alohida formatlash parametrlari orqali amalga oshirilishi mumkin.

Reader obyektini yaratayotganda, reader nusxasi aynan shu dialektdan foydalanishi kerakligini belgilash uchun dialect='myDialect'ni uzatamiz.

Dialektdan foydalanishning afzalligi shundaki, u dasturni modullarga ajratilgan (modular) qiladi. E'tibor bering, biz 'myDialect'ni CSV formatini qayta belgilamasdan boshqa fayllarni ochish uchun qayta ishlatishimiz mumkin.

CSV fayllarni csv.DictReader() bilan o'qish

csv.DictReader() klassining obyektlaridan CSV faylni lug'at sifatida o'qish uchun foydalanish mumkin.

6-misol: Python csv.DictReader()

Aytaylik, bizda quyidagi yozuvlarga ega CSV faylimiz (people.csv) bor:

kod
Name	Age	Profession
Jack	23	Doctor
Miller	22	Engineer

Keling, csv.DictReader()dan qanday foydalanish mumkinligini ko'ramiz.

example.py
import csv
with open("people.csv", 'r') as file:
    csv_file = csv.DictReader(file)
    for row in csv_file:
        print(dict(row))

Natija

kod
{'Name': 'Jack', ' Age': ' 23', ' Profession': ' Doctor'}
{'Name': 'Miller', ' Age': ' 22', ' Profession': ' Engineer'}

Ko'rib turganimizdek, birinchi qatorning yozuvlari lug'at kalitlari. Va, boshqa qatorlardagi yozuvlar lug'at qiymatlari.

Bu yerda, csv_file — csv.DictReader() obyekti. Bu obyekt for sikli yordamida aylanib chiqilishi mumkin. csv.DictReader() har bir qator uchun OrderedDict turini qaytardi. Shuning uchun biz har bir qatorni lug'atga aylantirish uchun dict()dan foydalandik.

E'tibor bering, biz for sikli ichida lug'atlar yaratish uchun aniq dict() metodidan foydalandik.

example.py
print(dict(row))

Eslatma: Python 3.8'dan boshlab, csv.DictReader() har bir qator uchun lug'at qaytaradi va bizga dict()dan aniq foydalanish shart emas.

csv.DictReader() klassining to'liq sintaksisi:

kod
csv.DictReader(file, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)

Bu haqda batafsil bilish uchun, tashrif buyuring: Python csv.DictReader() class

csv.Sniffer klassidan foydalanish

Sniffer klassi CSV faylining formatini aniqlash uchun ishlatiladi.

Sniffer klassi ikkita metodni taklif etadi:

sniff(sample, delimiters=None) - Bu funksiya CSV matnining berilgan namunasini tahlil qiladi va aniqlangan barcha parametrlarni o'z ichiga olgan Dialect kichik klassini qaytaradi.

Ixtiyoriy delimiters parametri mumkin bo'lgan yaroqli ajratuvchi belgilarni o'z ichiga olgan satr sifatida uzatilishi mumkin.

has_header(sample) - Bu funksiya namunaviy CSV birinchi qatorda ustun sarlavhalari (headers) borligini tahlil qilib, True yoki False qaytaradi.

Keling, bu funksiyalardan foydalanishga misolga qaraymiz:

7-misol: CSV fayllarning dialektini aniqlash uchun csv.Sniffer()dan foydalanish

Aytaylik, bizda quyidagi kontentga ega CSV faylimiz (office.csv) bor:

kod
"ID"| "Name"| "Email"
A878| "Alfonso K. Hamby"| "alfonsokhamby@rhyta.com"
F854| "Susanne Briard"| "susannebriard@armyspy.com"
E833| "Katja Mauer"| "kmauer@jadoop.com"

Keling, ushbu faylning formatini csv.Sniffer() klassi yordamida qanday aniqlash mumkinligiga qaraylik:

example.py
import csv
with open('office.csv', 'r') as csvfile:
    sample = csvfile.read(64)
    has_header = csv.Sniffer().has_header(sample)
    print(has_header)

    deduced_dialect = csv.Sniffer().sniff(sample)

with open('office.csv', 'r') as csvfile:
    reader = csv.reader(csvfile, deduced_dialect)

    for row in reader:
        print(row)

Natija

kod
True
['ID', 'Name', 'Email']
['A878', 'Alfonso K. Hamby', 'alfonsokhamby@rhyta.com']
['F854', 'Susanne Briard', 'susannebriard@armyspy.com']
['E833', 'Katja Mauer', 'kmauer@jadoop.com']

Ko'rib turganingizdek, biz office.csvning faqat 64 ta belgisini o'qib, uni sample o'zgaruvchisida saqladik.

Bu namuna keyin Sniffer().has_header() funksiyasiga parametr sifatida uzatildi. U birinchi qator ustun sarlavhalariga ega bo'lishi kerakligini aniqladi. Shunday qilib, u chop etilgan Trueni qaytardi.

Xuddi shunday, sample Sniffer().sniff() funksiyasiga ham uzatildi. U aniqlangan barcha parametrlarni Dialect kichik klassi sifatida qaytardi, bu esa deduced_dialect o'zgaruvchisida saqlandi.

Keyinroq, biz CSV faylni qayta ochdik va deduced_dialect o'zgaruvchisini csv.reader()ga parametr sifatida uzatdik.

U office.csv faylidagi ajratuvchi, qo'shtirnoq va skipinitialspace parametrlarini biz ularni aniq ko'rsatmasdan turib to'g'ri bashorat qila oldi.

Eslatma: csv moduli boshqa fayl kengaytmalari (masalan, .txt) uchun ham ishlatilishi mumkin, agar ularning kontenti to'g'ri tuzilishga ega bo'lsa.

Tavsiya etilgan o'qish: Write to CSV Files in Python

QBilimingizni sinab ko'ring
1 / 3

1. Standart holatda, CSV faylida ustunlar qaysi belgi bilan ajratiladi?