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

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

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

ฟังก์ชัน writer()

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

คลาส writer มีเมธอดดังนี้:

เมธอด writerow()

ฟังก์ชันนี้เขียนรายการใน iterable (list, tuple หรือ string) โดยคั่นด้วยอักขระ comma

เมธอด writerows()

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

ตัวอย่างต่อไปนี้แสดงการใช้ฟังก์ชัน writer() ก่อนอื่นเปิดไฟล์ในโหมด 'w' ใช้ไฟล์นี้เพื่อได้ออบเจ็กต์ writer แต่ละ tuple ในลิสต์ของ tuples จะถูกเขียนลงไฟล์ด้วยเมธอด 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

แทนที่จะวนลูปเขียนแต่ละแถว เราสามารถใช้เมธอด writerows() ได้:

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

ฟังก์ชัน reader()

ฟังก์ชันนี้คืนค่าออบเจ็กต์ reader ซึ่งคืนค่า iterator ของบรรทัดในไฟล์ csv โดยใช้ 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']

เนื่องจากออบเจ็กต์ reader เป็น iterator ฟังก์ชัน built-in next() ก็ใช้แสดงทุกบรรทัดในไฟล์ csv ได้เช่นกัน:

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

โมดูล csv ยังนิยามคลาส dialect dialect เป็นชุดมาตรฐานที่ใช้นำโปรโตคอล CSV ไปใช้งาน รายการ dialect ที่มีอยู่สามารถดูได้ด้วยฟังก์ชัน list_dialects()

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

ฟังก์ชัน DictWriter()

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

เมธอด writeheader()

เมธอดนี้เขียนลิสต์ของคีย์ใน dictionary เป็นบรรทัดที่คั่นด้วย comma เป็นบรรทัดแรกในไฟล์

ในตัวอย่างต่อไปนี้ กำหนดลิสต์ของรายการ dictionary แต่ละรายการเป็น dictionary ใช้เมธอด writerows() เขียนลงไฟล์แบบคั่นด้วย comma:

>>> 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 object ตัวนี้ก็เป็น iterator ใช้ดึงเนื้อหาไฟล์

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

คลาสให้แอตทริบิวต์ fieldnames คืนค่าคีย์ dictionary ที่ใช้เป็น header ของไฟล์:

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

ใช้ loop วนออบเจ็กต์ DictReader เพื่อดึง dictionary objects แต่ละตัว:

>>> 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 เป็น dictionary ปกติ ต้อง import OrderedDict จากโมดูล collections ก่อน:

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

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