29 / 59

Writing CSV files in Python

CSV fayllarga yozish 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.writer()ning asosiy qo'llanilishi

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

1-misol: CSV fayllarga csv.writer() bilan yozish

Aytaylik, biz quyidagi yozuvlarga ega CSV faylini yozmoqchimiz:

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

Mana buni qanday qilamiz.

example.py
import csv
with open('innovators.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(["SN", "Name", "Contribution"])
    writer.writerow([1, "Linus Torvalds", "Linux Kernel"])
    writer.writerow([2, "Tim Berners-Lee", "World Wide Web"])
    writer.writerow([3, "Guido van Rossum", "Python Programming"])

Yuqoridagi dasturni ishga tushirganimizda, joriy ishchi papkada berilgan yozuvlar bilan innovators.csv fayli yaratiladi.

Bu yerda biz open() funksiyasi yordamida innovators.csv faylini yozish rejimida ochdik.

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

Keyin, csv.writer() funksiyasi writer obyektini yaratish uchun ishlatiladi. So'ngra writer.writerow() funksiyasi CSV fayliga bitta qatorlarni yozish uchun ishlatiladi.

2-misol: writerows() bilan bir nechta qator yozish

Agar ikki o'lchamli ro'yxatning kontentini CSV fayliga yozish kerak bo'lsa, mana buni qanday qilish mumkin.

example.py
import csv
row_list = [["SN", "Name", "Contribution"],
             [1, "Linus Torvalds", "Linux Kernel"],
             [2, "Tim Berners-Lee", "World Wide Web"],
             [3, "Guido van Rossum", "Python Programming"]]
with open('protagonist.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerows(row_list)

Dasturning natijasi 1-misoldagi bilan bir xil.

Bu yerda, ikki o'lchamli ro'yxatimiz ro'yxat kontentini CSV fayliga yozish uchun writer.writerows() funksiyasiga uzatiladi.

Endi keling, CSV fayllarni turli formatlarda qanday yozishimiz mumkinligini ko'ramiz. Keyin ularni yozish uchun csv.writer() funksiyasini qanday moslashtirishni o'rganamiz.

Maxsus ajratuvchiga 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, biz 1-misoldagi innovators.csv faylida |dan ajratuvchi sifatida foydalanmoqchimiz. Bu faylni yozish uchun, csv.writer() funksiyasiga qo'shimcha delimiter parametrini uzatishimiz mumkin.

Keling, bir misol ko'ramiz.

3-misol: Pipe ajratuvchiga ega CSV fayl yozish

example.py
import csv
data_list = [["SN", "Name", "Contribution"],
             [1, "Linus Torvalds", "Linux Kernel"],
             [2, "Tim Berners-Lee", "World Wide Web"],
             [3, "Guido van Rossum", "Python Programming"]]
with open('innovators.csv', 'w', newline='') as file:
    writer = csv.writer(file, delimiter='|')
    writer.writerows(data_list)

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 = '|' parametri writer obyektiga CSV faylida | ajratuvchi sifatida ishlatilishi kerakligini belgilashga yordam beradi.

Qo'shtirnoqli CSV fayllar

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

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.writer()dan standart holatda foydalanish yozuvlarga bu qo'shtirnoqlarni qo'shmaydi.

Ularni qo'shish uchun, quoting nomli boshqa ixtiyoriy parametrdan foydalanishimiz kerak bo'ladi.

Keling, son bo'lmagan qiymatlar atrofida qo'shtirnoq va ; ajratuvchi sifatida qanday ishlatilishiga misol ko'ramiz.

4-misol: Qo'shtirnoqli CSV fayllarga yozish

example.py
import csv
row_list = [
    ["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"]
]
with open('quotes.csv', 'w', newline='') as file:
    writer = csv.writer(file, quoting=csv.QUOTE_NONNUMERIC, delimiter=';')
    writer.writerows(row_list)

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"

Bu yerda, quotes.csv fayli ishchi papkada yuqoridagi yozuvlar bilan yaratiladi.

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

csv.QUOTE_NONNUMERIC writer obyektiga son bo'lmagan yozuvlar atrofiga qo'shtirnoq qo'shilishi kerakligini belgilaydi.

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

  • csv.QUOTE_ALL - writer obyektiga CSV faylni barcha yozuvlar atrofida qo'shtirnoq bilan yozishni belgilaydi.
  • csv.QUOTE_MINIMAL - writer obyektiga faqat maxsus belgilarni (ajratuvchi, qo'shtirnoq belgisi yoki lineterminator'dagi biror belgi) o'z ichiga olgan maydonlarnigina qo'shtirnoqqa olishni belgilaydi.
  • csv.QUOTE_NONE - writer obyektiga hech qanday yozuv qo'shtirnoqqa olinmasligi kerakligini belgilaydi. Bu standart qiymat.

Maxsus qo'shtirnoq belgisiga ega CSV fayllar

CSV fayllarni maxsus qo'shtirnoq belgilari bilan ham yozishimiz mumkin. Buning uchun, quotechar nomli ixtiyoriy parametrdan foydalanishimiz kerak bo'ladi.

Keling, 4-misoldagi quotes.csv faylini yozishga, lekin qo'shtirnoq belgisi sifatida *dan foydalanib, misol ko'ramiz.

5-misol: Maxsus qo'shtirnoq belgisi bilan CSV fayllarga yozish

example.py
import csv
row_list = [
    ["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"]
]
with open('quotes.csv', 'w', newline='') as file:
    writer = csv.writer(file, quoting=csv.QUOTE_NONNUMERIC,
                        delimiter=';', quotechar='*')
    writer.writerows(row_list)

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*

Bu yerda ko'rishimiz mumkinki, quotechar='*' parametri writer obyektiga barcha son bo'lmagan qiymatlar uchun qo'shtirnoq sifatida *dan foydalanishni buyuradi.

CSV modulida dialektlar (Dialects)

5-misolda, biz csv.writer() funksiyasiga bir nechta parametrni (quoting, delimiter va quotechar) 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 dialectni 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.

6-misol: Dialekt yordamida CSV fayl yozish

Aytaylik, biz quyidagi kontentga ega CSV faylini (office.csv) yozmoqchimiz:

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 har bir yozuv atrofida qo'shtirnoq bor va | ajratuvchi sifatida ishlatilgan.

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

example.py
import csv
row_list = [
    ["ID", "Name", "Email"],
    ["A878", "Alfonso K. Hamby", "alfonsokhamby@rhyta.com"],
    ["F854", "Susanne Briard", "susannebriard@armyspy.com"],
    ["E833", "Katja Mauer", "kmauer@jadoop.com"]
]
csv.register_dialect('myDialect',
                     delimiter='|',
                     quoting=csv.QUOTE_ALL)
with open('office.csv', 'w', newline='') as file:
    writer = csv.writer(file, dialect='myDialect')
    writer.writerows(row_list)

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 yerda, office.csv ishchi papkada yuqoridagi kontent bilan yaratiladi.

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

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

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

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

Dialektdan foydalanishning afzalligi shundaki, u dasturni modullarga ajratilgan qiladi. E'tibor bering, biz myDialectni CSV formatini qayta belgilamasdan boshqa CSV fayllarni yozish uchun qayta ishlatishimiz mumkin.

CSV fayllarga csv.DictWriter() bilan yozish

csv.DictWriter() klassining obyektlaridan Python lug'atidan CSV fayliga yozish uchun foydalanish mumkin.

csv.DictWriter() klassining minimal sintaksisi:

kod
csv.DictWriter(file, fieldnames)

Bu yerda,

  • file - yozmoqchi bo'lgan CSV fayl
  • fieldnames - ma'lumot CSV fayliga qanday tartibda yozilishi kerakligini belgilovchi ustun sarlavhalarini o'z ichiga olishi kerak bo'lgan ro'yxat obyekti

7-misol: Python csv.DictWriter()

example.py
import csv

with open('players.csv', 'w', newline='') as file:
    fieldnames = ['player_name', 'fide_rating']
    writer = csv.DictWriter(file, fieldnames=fieldnames)

    writer.writeheader()
    writer.writerow({'player_name': 'Magnus Carlsen', 'fide_rating': 2870})
    writer.writerow({'player_name': 'Fabiano Caruana', 'fide_rating': 2822})
    writer.writerow({'player_name': 'Ding Liren', 'fide_rating': 2801})

Natija

Dastur quyidagi yozuvlarga ega players.csv faylini yaratadi:

kod
player_name,fide_rating
Magnus Carlsen,2870
Fabiano Caruana,2822
Ding Liren,2801

csv.DictWriter() klassining to'liq sintaksisi:

kod
csv.DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)

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

lineterminator'ga ega CSV fayllar

Lineterminator — writer obyektlari tomonidan hosil qilingan qatorlarni tugatish uchun ishlatiladigan satr. Standart qiymati \r\n. Uning qiymatini lineterminator parametri sifatida istalgan satrni uzatish orqali o'zgartirishingiz mumkin.

Biroq, reader obyekti faqat \n yoki \rni lineterminator qiymatlari sifatida tan oladi. Shuning uchun boshqa belgilardan qator tugatuvchi (line terminator) sifatida foydalanish qattiq tavsiya etilmaydi.

CSV modulida doublequote va escapechar

Yozuvlardagi ajratuvchi belgilarni ajratish uchun, csv moduli standart holatda yozuvlarni qo'shtirnoq belgilari yordamida qo'shtirnoqqa oladi.

Shunday qilib, agar sizda He is a strong, healthy man degan yozuv bo'lsa, u "He is a strong, healthy man" ko'rinishida yoziladi.

Xuddi shunday, csv moduli standart holatda yozuvlarda mavjud bo'lgan qo'shtirnoq belgisini escape qilish uchun ikkilangan qo'shtirnoqdan foydalanadi.

Agar sizda Go to "programiz.com" degan yozuv bo'lsa, u "Go to ""programiz.com""" ko'rinishida yoziladi.

Bu yerda, har bir " dan keyin oldingisini escape qilish uchun yana bitta " kelishini ko'rishimiz mumkin.

doublequote

U yozuvning o'zida mavjud bo'lgan quotechar qanday qo'shtirnoqqa olinishini boshqaradi. True bo'lganda, qo'shtirnoq belgisi ikkilanadi, False bo'lganda esa escapechar quotecharga prefiks sifatida ishlatiladi. Standart qiymati True.

escapechar

escapechar parametri — agar quoting csv.QUOTE_NONEga o'rnatilgan bo'lsa ajratuvchini, yoki agar doublequote False bo'lsa quotecharni escape qilish uchun ishlatiladigan satr. Uning standart qiymati None.

8-misol: csv writer'da escapechar'dan foydalanish

example.py
import csv
row_list = [
    ['Book', 'Quote'],
    ['Lord of the Rings',
        '"All we have to decide is what to do with the time that is given us."'],
    ['Harry Potter', '"It matters not what someone is born, but what they grow to be."']
]
with open('book.csv', 'w', newline='') as file:
    writer = csv.writer(file, escapechar='/', quoting=csv.QUOTE_NONE)
    writer.writerows(row_list)

Natija

kod
Book,Quote
Lord of the Rings,/"All we have to decide is what to do with the time that is given us./"
Harry Potter,/"It matters not what someone is born/, but what they grow to be./"

Bu yerda ko'rishimiz mumkinki, biz quoting=csv.QUOTE_NONEni belgilaganimiz uchun / barcha " va , belgilariga prefiks bo'lib kelmoqda.

Agar bu belgilanmaganida, natija quyidagicha bo'lardi:

kod
Book,Quote
Lord of the Rings,"""All we have to decide is what to do with the time that is given us."""
Harry Potter,"""It matters not what someone is born, but what they grow to be."""

Qo'shtirnoqqa olishga ruxsat berganimiz uchun, maxsus belgilarga ega (bu holda ") yozuvlar ikki qavatli qo'shtirnoqqa olinadi. Ajratuvchiga ega yozuvlar ham qo'shtirnoq belgilari (boshlanish va yopilish qo'shtirnoq belgilari) ichiga olinadi.

Qolgan qo'shtirnoq belgilari satrning bir qismi bo'lgan haqiqiy "ni escape qilish uchun, ular quotechar sifatida talqin qilinmasligi uchun ishlatiladi.

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: Read CSV Files in Python

QBilimingizni sinab ko'ring
1 / 3

1. CSV faylga bir nechta qatorni bir vaqtning o'zida (ro'yxatlar ro'yxatidan) yozish uchun qaysi metod ishlatiladi?