Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การอ่านและการเขียนไฟล์ CSV โดยใช้ Python


รูปแบบ CSV (ย่อมาจากค่าที่คั่นด้วยจุลภาค) เป็นรูปแบบข้อมูลที่ใช้กันทั่วไปในสเปรดชีต โมดูล csv ในไลบรารีมาตรฐานของ Python นำเสนอคลาสและวิธีการดำเนินการอ่าน/เขียนในไฟล์ CSV

นักเขียน()

ฟังก์ชันนี้ในโมดูล csv ส่งคืนอ็อบเจ็กต์ตัวเขียนที่แปลงข้อมูลเป็นสตริงที่คั่นและจัดเก็บในอ็อบเจ็กต์ไฟล์ ฟังก์ชันต้องการอ็อบเจ็กต์ไฟล์ที่มีสิทธิ์เขียนเป็นพารามิเตอร์ ทุกแถวที่เขียนในไฟล์จะออกอักขระขึ้นบรรทัดใหม่ เพื่อป้องกันช่องว่างระหว่างบรรทัด พารามิเตอร์ขึ้นบรรทัดใหม่ถูกกำหนดเป็น ‘’

คลาสนักเขียนมีวิธีการดังต่อไปนี้

นักเขียน()

ฟังก์ชันนี้เขียนรายการใน iterable (list, tuple หรือ string) โดยแยก n ออกจากอักขระลูกน้ำ

นักเขียน()

ฟังก์ชันนี้รับรายการของ iterables เป็นพารามิเตอร์และเขียนแต่ละรายการเป็นบรรทัดของรายการที่คั่นด้วยเครื่องหมายจุลภาคในไฟล์

ตัวอย่างต่อไปนี้แสดงการใช้ฟังก์ชัน write() ขั้นแรกให้เปิดไฟล์ในโหมด 'w' ไฟล์นี้ใช้เพื่อรับอ็อบเจ็กต์ตัวเขียน ทูเพิลแต่ละรายการในรายการทูเพิลจะถูกเขียนไปยังไฟล์โดยใช้เมธอด writerow()

>>> import csv
>>> persons=[('Lata',22,45),('Anil',21,56),('John',20,60)]
>>> csvfile=open('persons.csv','w', newline='')
>>> obj=csv.writer(csvfile)
>>> for person in persons:
obj.writerow(person)
>>> csvfile.close()

สิ่งนี้จะสร้างไฟล์ 'persons.csv' ในไดเร็กทอรีปัจจุบัน มันจะแสดงข้อมูลต่อไปนี้

Lata,22,45
Anil,21,56
John,20,60

Instad ของการวนซ้ำรายการเพื่อเขียนแต่ละแถวแยกกัน เราสามารถใช้เมธอด writerows() ได้

>>> csvfile = open('persons.csv','w', newline='')
>>> obj = csv.writer(csvfile)
>>> obj.writerows(persons)
>>> obj.close()

อ่าน()

ฟังก์ชันนี้ส่งคืนวัตถุตัวอ่านซึ่งส่งคืนตัววนซ้ำของบรรทัดในไฟล์ csv เมื่อใช้ Regular for loop ทุกบรรทัดในไฟล์จะแสดงในตัวอย่างต่อไปนี้

>>> csvfile=open('persons.csv','r', newline='')
>>> obj=csv.reader(csvfile)
>>> for row in obj:
print (row)
['Lata', '22', '45']
['Anil', '21', '56']
['John', '20', '60']

เนื่องจากวัตถุตัวอ่านเป็นตัววนซ้ำ ฟังก์ชัน next() ในตัวจึงมีประโยชน์ในการแสดงบรรทัดทั้งหมดในไฟล์ csv

>>> csvfile = open('persons.csv','r', newline='')
>>> obj = csv.reader(csvfile)
>>> while True:
try:
row=next(obj)
print (row)
except StopIteration:
break

โมดูล csv ยังกำหนดคลาสภาษา ภาษาคือชุดของมาตรฐานที่ใช้ในการปรับใช้โปรโตคอล CSV สามารถรับรายการภาษาถิ่นได้จากฟังก์ชัน list_dialects()

>>> csv.list_dialects()
['excel', 'excel-tab', 'unix']

DictWriter()

ฟังก์ชันนี้ส่งคืนอ็อบเจ็กต์ DictWriter คล้ายกับอ็อบเจกต์ตัวเขียน แต่แถวถูกแมปกับอ็อบเจ็กต์พจนานุกรม ฟังก์ชันนี้ต้องการอ็อบเจ็กต์ไฟล์ที่มีสิทธิ์เขียนและรายการคีย์ที่ใช้ในพจนานุกรมเป็นพารามิเตอร์ fieldnames ใช้สำหรับเขียนบรรทัดแรกในไฟล์เป็นส่วนหัว

หัวเขียน()

เมธอดนี้จะเขียนรายการคีย์ในพจนานุกรมโดยคั่นด้วยเครื่องหมายจุลภาคเป็นบรรทัดแรกในไฟล์

ในตัวอย่างต่อไปนี้ มีการกำหนดรายการพจนานุกรม แต่ละรายการในรายการเป็นพจนานุกรม เมื่อใช้เมธอด writrows() ไฟล์จะถูกเขียนไปยังไฟล์โดยคั่นด้วยเครื่องหมายจุลภาค

>>> persons=[{'name':'Lata', 'age':22, 'marks':45}, {'name':'Anil', 'age':21, 'marks':56}, {'name':'John', 'age':20, 'marks':60}]
>>> csvfile=open('persons.csv','w', newline='')
>>> fields=list(persons[0].keys())
>>> obj=csv.DictWriter(csvfile, fieldnames=fields)
>>> obj.writeheader()
>>> obj.writerows(persons)
>>> csvfile.close()

ไฟล์แสดงเนื้อหาต่อไปนี้

name,age,marks
Lata,22,45
Anil,21,56
John,20,60

DictReader()

ฟังก์ชันนี้ส่งคืนอ็อบเจ็กต์ DictReader จากไฟล์ CSV พื้นฐาน ในกรณีของ reader วัตถุอันนี้ยังเป็น iterator โดยใช้เนื้อหาของไฟล์ที่ถูกดึงออกมา

>>> csvfile = open('persons.csv','r', newline='')
>>> obj = csv.DictReader(csvfile)

คลาสมีแอตทริบิวต์ fieldnames ส่งคืนคีย์พจนานุกรมที่ใช้เป็นส่วนหัวของไฟล์

>>> obj.fieldnames
['name', 'age', 'marks']

ใช้การวนซ้ำวัตถุ DictReader เพื่อดึงวัตถุพจนานุกรมแต่ละรายการ

>>> for row in obj:
print (row)

ส่งผลให้ได้ผลลัพธ์ที่ตามมา

OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
OrderedDict([('name', 'Anil'), ('age', '21'), ('marks', '56')])
OrderedDict([('name', 'John'), ('age', '20'), ('marks', '60')])

ในการแปลงออบเจ็กต์ OrderedDict เป็นพจนานุกรมปกติ เราต้องนำเข้า OrderedDict จากโมดูลคอลเลกชันก่อน

>>> from collections import OrderedDict
>>> r=OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
>>> dict(r)
{'name': 'Lata', 'age': '22', 'marks': '45'}

ในบทความนี้ได้มีการอธิบายคุณสมบัติของโมดูล csv