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:
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.
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:
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.
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.
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.
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
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
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.
Ba'zi CSV fayllarda har bir yoki ba'zi yozuvlar atrofida qo'shtirnoq bo'ladi.
Keling, quotes.csvni quyidagi yozuvlar bilan misol sifatida olamiz:
"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
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
"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.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
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
*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.
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:
"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.
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
"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:
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.DictWriter() klassining obyektlaridan Python lug'atidan CSV fayliga yozish uchun foydalanish mumkin.
csv.DictWriter() klassining minimal sintaksisi:
csv.DictWriter(file, fieldnames)
Bu yerda,
file - yozmoqchi bo'lgan CSV faylfieldnames - ma'lumot CSV fayliga qanday tartibda yozilishi kerakligini belgilovchi ustun sarlavhalarini o'z ichiga olishi kerak bo'lgan ro'yxat obyekti7-misol: Python csv.DictWriter()
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:
player_name,fide_rating
Magnus Carlsen,2870
Fabiano Caruana,2822
Ding Liren,2801
csv.DictWriter() klassining to'liq sintaksisi:
csv.DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)
Bu haqda batafsil bilish uchun, tashrif buyuring: Python csv.DictWriter() class
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.
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
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
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:
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