ไฟล์ csv คือ
ไฟล์ csv คือไฟล์ตัวหนังสือที่สร้างเป็นข้อมูลตารางด้วยการเขียนคั่นแต่ละตัวในแนวนอนด้วยจุลภาค
ตัวอย่างเช่นถ้าหากเปิดโปรแกรมแก้ไขข้อความขึ้นมา แล้วเขียนข้อความลงไปแบบนี้
ซาบะ,鯖,サバ
อิวาชิ,鰯,イワシ
มางุโระ,鮪,マグロ
อายุ,鮎,アユ
แล้วบันทึกไฟล์โดยตั้งชื่อเป็น .csv เช่น raichuepla.csv
จากนั้นไปเปิดในโปรแกรมเช่น excel จะได้เป็นตารางแบบนี้
ซาบะ |
鯖 |
サバ |
อิวาชิ |
鰯 |
イワシ |
มางุโระ |
鮪 |
マグロ |
อายุ |
鮎 |
アユ |
ด้วยความเรียบง่ายแบบนี้ ทำให้ .csv เป็นรูปแบบที่นิยมในการใช้เก็บข้อมูลตัวหนังสือเป็นตาราง
มอดูล csv ในไพธอน
ในภาษาไพธอนมีมอดูลที่ใช้สำหรับอ่านไฟล์ csv โดยเฉพาะเตรียมไว้ ชื่อมอดูลก็ตรงตัวเลยคือ
csv
เนื่องจากเป็นมอดูลที่มีอยู่ในตัวมาพร้อมกับไพธอนอยู่แล้วจึงไม่ต้องติดตั้งเพิ่ม สามารถ import เพื่อใช้ได้เลย
import csv
การอ่านไฟล์ csv
การอ่านไฟล์ทำได้โดยใช้ฟังก์ชัน csv.reader
โดยจะต้องทำการเปิดไฟล์ออกมาก่อน แล้วใช้ csv.reader กับออบเจ็กต์ไฟล์ที่เปิดมา
โดยทั่วไปจะใช้กับโครงสร้าง with
ตัวอย่างเช่น ลองเปิดไฟล์ raichuepla.csv ที่บันทึกไว้
with open('raichuepla.csv') as f:
khai = csv.reader(f)
for k in khai:
print(k)
ได้
['ซาบะ', '鯖', 'サバ']
['อิวาชิ', '鰯', 'イワシ']
['มางุโระ', '鮪', 'マグロ']
['อายุ', '鮎', 'アユ']
เมื่อใช้ csv.reader จะเป็นการสร้างออบเจ็กต์สำหรับอ่าน csv ในที่นี้ใส่ไว้ในตัวแปร khai จากนั้นสามารถเอาออบเจ็กต์นั้นมาวนซ้ำใน for เพื่อไล่ดูข้อมูลทีละบรรทัด โดยจะได้มาเป็นลิสต์
การเขียนไฟล์ csv
การเขียนไฟล์ csv ทำได้โดยใช้เมธอด csv.writer โดยต้องเปิดไฟล์ในโหมด 'w' (อ่าน) จากนั้นใช้เมธอด writerow แล้วใส่ลิสต์ของข้อมูลแต่ละแถวลงไป
ตัวอย่าง
with open('raikan_ahan.csv','w') as f:
nok = csv.writer(f)
nok.writerow(['ผัดกะเพรา',50])
nok.writerow(['แกงจืดเต้าหู้',55])
nok.writerow(['ต้มยำกุ้ง',70])
แล้วก็จะได้ไฟล์แบบนี้มา
ผัดกะเพรา,50
แกงจืดเต้าหู้,55
ต้มยำกุ้ง,70
ถ้าเตรียมข้อมูลไว้ในรูปแบบลิสต์ซ้อนลิสต์อยู่แล้วก็อาจใช้ writerows เพื่อเขียนหลายแถวพร้อมกันได้เลย
khomun = [['ไข่ปลาแซลมอน',80],
['ไข่กุ้ง',40],
['ไข่หวาน',20]]
with open('raikan_ahan.csv','w') as f:
nok = csv.writer(f)
nok.writerows(khomun)
ได้
ไข่ปลาแซลมอน,80
ไข่กุ้ง,40
ไข่หวาน,20
จะใช้ writerrow ร่วมกับ for เพื่อไล่ทีละแถวแบบนี้ก็ได้ ก็ได้ผลเหมือนตัวอย่างข้างบนที่ใช้ writerows
with open('raikan_ahan.csv','w') as f:
nok = csv.writer(f)
for k in khomun:
nok.writerow(k)
การอ่านไฟล์ csv ที่มีชื่อคอลัมน์ออกมาเป็น OrderedDict
สมมุติว่ามีไฟล์ที่บรรทัดแรกตั้งเป็นหัวข้อ เช่น
อาหาร,ราคา
ข้าวผัดกุ้ง,55
ข้าวคะน้าปลาเค็ม,50
ข้าวหน้าหมูสับ,40
แบบนี้อ่านด้วยฟังก์ชัน csv.DictReader จะเหมาะกว่า
วิธีการคล้ายกันกับตอนใช้ csv.reader แต่ข้อมูลที่ได้จะอยู่ในรูปของ OrderedDict แทนที่จะเป็นลิสต์
เกี่ยวกับ OrderedDict นั้นอ่านได้ใน
https://phyblas.hinaboshi.com/20190706
ตัวอย่างเช่น ข้อมูลในตัวอย่างนี้อ่านได้โดย
with open('raikan_ahan.csv') as f:
khai = csv.DictReader(f)
for k in khai:
print(k)
print(k['อาหาร'])
print(khai.fieldnames)
จะได้
OrderedDict([('อาหาร', 'ข้าวผัดกุ้ง'), ('ราคา', '55')])
ข้าวผัดกุ้ง
OrderedDict([('อาหาร', 'ข้าวคะน้าปลาเค็ม'), ('ราคา', '50')])
ข้าวคะน้าปลาเค็ม
OrderedDict([('อาหาร', 'ข้าวหน้าหมูสับ'), ('ราคา', '40')])
ข้าวหน้าหมูสับ
['อาหาร', 'ราคา']
บรรทัดแรกของไฟล์จะกลายเป็นคีย์ของ OrderedDict ของข้อมูลในบรรทัดต่อมาทั้งหมด สามารถดูค่าได้ที่แอตทริบิวต์ fieldnames
นอกจากนี้ ข้อมูลที่ไม่ได้เตรียมบรรทัดแรกไว้ให้เป็นชื่อคีย์ก็สามารถกำหนดคีย์เองได้ โดยใส่ตัวเลือกเสริม fieldnames
เช่น
ปลากระพงนึ่งมะนาว,105
หมูทอดกระเทียมพริกไทย,55
เปิดอ่าน
with open('raikan_ahan.csv') as f:
khai = csv.DictReader(f,fieldnames=['อาหาร','ราคา'])
for k in khai:
print(k)
จะได้
OrderedDict([('อาหาร', 'ปลากระพงนึ่งมะนาว'), ('ราคา', '105 ')])
OrderedDict([('อาหาร', 'หมูทอดกระเทียมพริกไทย'), ('ราคา', '55')])
ถ้าหากมีข้อมูลแถวไหนที่จำนวนมากเกินคอลัมน์ ปกติส่วนที่เกินจะไปอยู่ในคีย์ None แต่ก็สามารถกำหนดชื่อคีย์ของส่วนที่เกินมาได้โดยใส่ในตัวเลือกเสริม restkey
ข้าวปูผัดผงกะหรี่,105
ข้าวราดมันกุ้ง,85
ข้าวหมึกทอดกระเทียม,60,พิเศษ 80
with open('raikan_ahan.csv') as f:
khai = csv.DictReader(f,fieldnames=['อาหาร'],restkey='ราคา')
for k in khai:
print(k)
ได้
OrderedDict([('อาหาร', 'ข้าวปูผัดผงกะหรี่'), ('ราคา', ['105'])])
OrderedDict([('อาหาร', 'ข้าวราดมันกุ้ง'), ('ราคา', ['85'])])
OrderedDict([('อาหาร', 'ข้าวหมึกทอดกระเทียม'), ('ราคา', ['60', 'พิเศษ 80'])])
ในทางตรงข้าม ถ้าข้อมูลมีคอลัมน์ไม่ครบก็จะได้ค่าว่างเปล่า แต่สามารถกำหนดค่าที่จะเติมลงไปแทนได้ด้วยตัวเลือกเสริม restval
เช่น
ผลไม้,ขีดละ,กิโลละ
ส้มโอ,,150
ทุเรียน,120,1199
เงาะ,10
with open('phonlamai.csv') as f:
khai = csv.DictReader(f,restval='--')
for k in khai:
print(k)
ได้
OrderedDict([('ผลไม้', 'ส้มโอ'), ('ขีดละ', ''), ('กิโลละ', '150')])
OrderedDict([('ผลไม้', 'ทุเรียน'), ('ขีดละ', '120'), ('กิโลละ', '1199')])
OrderedDict([('ผลไม้', 'เงาะ'), ('ขีดละ', '10'), ('กิโลละ', '--')])
การเขียนไฟล์ csv พร้อมใส่ชื่อคอลัมน์
หากมีข้อมูลที่เป็นลิสต์ของดิกแล้วต้องการเขียนลงเป็นไฟล์ csv โดยบันทึกชื่อคีย์ไปด้วยก็อาจใช้ฟังก์ชัน csv.DictWriter แทน csv.writer ธรรมดา
ฟังก์ชันนี้เวลาใช้ต้องกำหนดชื่อคีย์ที่ต้องการอ่านไปด้วย โดยใส่เป็นค่าอาร์กิวเมนต์ตัวที่ ๒ ต่อจากออบเจ็กต์ไฟล์
ส่วนการเขียนชื่อคีย์จะใช้เมธอด writeheader()
ตัวอย่าง
khomun = [{'หน้า':'ปลาแซลมอน','ราคา':45,'น้ำหนัก':20},
{'หน้า':'กุ้งหวาน','ราคา':40},
{'หน้า':'ปูอัด','น้ำหนัก':25}]
with open('raikan_ahan.csv','w') as f:
nok = csv.DictWriter(f,['หน้า','ราคา','น้ำหนัก'])
nok.writeheader()
nok.writerows(khomun)
จะได้ไฟล์แบบนี้
หน้า,ราคา,น้ำหนัก
ปลาแซลมอน,45,20
กุ้งหวาน,40,
ปูอัด,,25
คีย์ไหนที่มีแค่บางอันจะถูกอ่านข้ามไป
หรือถ้าจะกำหนดให้มีการใส่ข้อความบางอย่างแทนเวลาไม่มีก็ใส่ตัวเลือกเสริม restval
with open('raikan_ahan.csv','w') as f:
nok = csv.DictWriter(f,['หน้า','ราคา','น้ำหนัก'],restval='xxx')
nok.writeheader()
nok.writerows(khomun)
ได้
หน้า,ราคา,น้ำหนัก
ปลาแซลมอน,45,20
กุ้งหวาน,40,xxx
ปูอัด,xxx,25
กรณีที่ในดิกชันนารีที่ใส่ไปนั้นมีคีย์ที่ไม่ได้ระบุไว้ ปกติจะเกิดข้อผิดพลาด
เช่น เมื่อเผลอไม่ได้ใส่คีย์ไปตัวหนึ่ง
with open('raikan_ahan.csv','w') as f:
nok = csv.DictWriter(f,['หน้า','ราคา'])
nok.writeheader()
nok.writerows(khomun) # ได้ ValueError: dict contains fields not in fieldnames: 'น้ำหนัก'
แต่ถ้าตอนใช้ csv.DictWriter ใส่ตัวเลือกเสริม extrasaction='ignore' ไปก็จะแค่มองข้ามที่ไม่ได้ใส่ไปเฉยๆแล้วจะเขียนได้โดยไม่เกิดข้อผิดพลาด
with open('raikan_ahan.csv','w') as f:
nok = csv.DictWriter(f,['หน้า','ราคา'],extrasaction='ignore')
nok.writeheader()
nok.writerows(khomun)
ได้
หน้า,ราคา
ปลาแซลมอน,45
กุ้งหวาน,40
ปูอัด,
ตัวเลือกปรับรูปแบบการอ่านและเขียน
ทั้งเวลาที่เขียนและอ่านสามารถใส่ตัวเลือกเสริมเพื่อกำหนดรูปแบบการอ่านลงไปได้หลายอย่าง
ได้แก่
ตัวเลือก |
ความหมาย |
ค่าตั้งต้น |
delimiter |
อักษรที่เป็นตัวกั้น |
, |
doublequote |
ถ้าเป็น 0 จะใช้เอสเคปเมื่อในข้อมูลมีอักษรที่ใช้คร่อม
ถ้าเป็น 1 จะใช้การเพิ่มอักษรเป็น ๒ ตัว |
1 |
escapechar |
อักษรเอสเคปที่จะใช้ |
None |
lineterminator |
อักษรที่แทนการขึ้นบรรทัดใหม่ |
\r\n |
quotechar |
เครื่องหมายคำพูดที่ใช้ล้อมคำที่มีอักษรพิเศษ |
" |
quoting |
กำหนดว่าจะคร่อมเครื่องหมายคำพูดเมื่อเจอข้อมูลแบบไหนบ้าง |
0 |
skipinitialspace |
ถ้าเป็น 1 จะมองข้ามช่องว่างที่อยู่หลังอักษรที่เป็นตัวกั้น |
0 |
strict |
ถ้าเป็น 1 จะให้เกิดข้อผิดพลาดเมื่อมีค่าที่ไม่สามารถอ่านได้อย่างปกติ |
0 |
แต่ละตัวจะอธิบายรายละเอียดต่อไป
การกำหนดตัวกั้นคอลัมน์และตัวขึ้นบรรทัดใหม่
ปกติแล้วไฟล์ csv จะใช้จุลภาค , เป็นตัวกั้น แต่ถ้าใส่ตัวเลือก delimiter สามารถกำหนดตัวกั้นเป็นอักษรที่ต้องการได้
ส่วนจุดที่เปลี่ยนแถวนั้นปกติใช้การขึ้นบรรทัดใหม่ โดยเป็น \r\n แทนที่จะเป็น \n ธรรมดาเพื่อให้สามารถถูกอ่านตีความเป็นการขึ้นบรรทัดใหม่ได้ในทุกโปรแกรม เพราะในโปรแกรมบางตัวอย่างอย่าง notepad ถ้าเจอแค่ \n จะไม่ตีความเป็นขึ้นบรรทัดใหม่ ต้องเป็น \r\n เท่านั้น แค่ถ้าใช้ \r\n จะอ่านจากโปรแกรมไหนก็ถือเป็นการขึ้นบรรทัดใหม่ได้หมด
ตัวกั้นเปลี่ยนแถวสามารถกำหนดตามที่ต้องการได้โดยใส่ที่ตัวเลือก lineterminator
ตัวอย่าง
khomun = [['ข้าวผัดปู',55],
['ข้าวผัดหอย',60],
['ข้าวผัดปลา',65]]
with open('raikan_ahan.csv','w') as f:
nok = csv.writer(f,delimiter='~',lineterminator=' || ')
nok.writerows(khomun)
ได้
ข้าวผัดปู~55 || ข้าวผัดหอย~60 || ข้าวผัดปลา~65 ||
อักษรที่ใช้คร่อมเมื่อเจอตัวกั้น
ปกติถ้าหากว่าในข้อมูลมีตัวอักษรที่ใช้เป็นตัวกั้นอยู่ เวลาเขียนไฟล์ csv จะมีการใส่เครื่องหมายคำพูดคร่อมไว้ เช่น
khomun = [['ข้าวผัดหมู,ข้าวผัดไก่',45],
['ข้าวผัดทะเล',55]]
with open('raikan_ahan.csv','w') as f:
nok = csv.writer(f)
nok.writerows(khomun)
ได้
"ข้าวผัดหมู,ข้าวผัดไก่",45
ข้าวผัดทะเล,55
แต่เราสามารถกำหนดให้ใช้อย่างอื่นเป็นตัวกั้นแทนได้โดยใส่ตัวเลือกเสริม quotechar
เช่น
with open('raikan_ahan.csv','w') as f:
nok = csv.writer(f,quotechar='*')
nok.writerows(khomun)
ได้
*ข้าวผัดหมู,ข้าวผัดไก่*,45
ข้าวผัดทะเล,55
แต่เรื่องจะยุ่งขึ้นอีกหน่อยเมื่อมีอักษรที่ใช้สำหรับคร่อมนั้นอยู่ในข้อมูลด้วย เช่น
khomun = [["ข้าวผัด 'หมู','ไก่'-",45],
["ข้าวผัด 'ปู','ปลา'-",55]]
with open('raikan_ahan.csv','w') as f:
nok = csv.writer(f,quotechar="'")
nok.writerows(khomun)
แบบนี้ตัวที่ใช้คร่อมนั้นจะถูกเขียนเพิ่มกลายเป็น ๒ ตัวแทน เพื่อไม่ให้ถูกตีความเป็นจุดสิ้นสุดคอลัมน์
'ข้าวผัด ''หมู'',''ไก่''-',45
'ข้าวผัด ''ปู'',''ปลา''-',55
แต่ก็สามารถกำหนดให้เพิ่มอักษรเอสเคปลงไป แทนที่จะเพิ่มตัวคร่อมเป็น ๒ อันแบบนั้น ทำได้โดยใส่ตัวเลือกเสริม doublequote เป็น 0 แล้วใส่ตัวเลือกเสริม escapechar เป็นตัวที่ต้องการใช้เป็นตัวเอสเคป
เช่น
with open('raikan_ahan.csv','w') as f:
nok = csv.writer(f,quotechar="'",doublequote=0,escapechar='๛')
nok.writerows(khomun)
ได้
'ข้าวผัด ๛'หมู๛',๛'ไก่๛'-',45
'ข้าวผัด ๛'ปู๛',๛'ปลา๛'-',55
การกำหนดตัวที่ต้องถูกคร่อม
ปกติแล้วการคร่อมด้วยเครื่องหมายคำพูดนั้นจะเกิดขึ้นเมื่อข้อมูลในคอลัมน์มีตัวอักษรที่เป็นตัวกั้นอยู่
แต่ว่าก็สามารถเปลี่ยนเงื่อนไขให้คร่อมทั้งหมดได้ โดยกำหนดตัวเลือกเสริม quoting โดยใส่ค่าเป็น csv.QUOTE_ALL หรือ 1
เช่น
khomun = [['ข้าวหน้าไก่',55],
['ข้าวหน้าเป็ด',60]]
with open('raikan_ahan.csv','w') as f:
nok = csv.writer(f,quoting=1)
nok.writerows(khomun)
ได้
"ข้าวหน้าไก่","55"
"ข้าวหน้าเป็ด","60"
ถ้าใส่ csv.QUOTE_NONNUMERIC หรือ 2 จะคร่อมทุกตัวที่ไม่ใช่ตัวเลข
with open('raikan_ahan.csv','w') as f:
nok = csv.writer(f,quoting=2)
nok.writerows(khomun)
ได้
"ข้าวหน้าไก่",55
"ข้าวหน้าเป็ด",60
ถ้าใส่ csv.QUOTE_NONE หรือ 3 จะไม่มีการคร่อม แต่จะใช้อักษรเอสเคปแทน โดยต้องใส่ escapechar เพื่อกำหนดอักษรเอสเคปด้วย
เช่น
khomun = [['ข้าวหน้าเนื้อวัว',65],
['ข้าวหน้าเนื้อหมู,เห็ด,เป็ด,ไก่',55]]
with open('raikan_ahan.csv','w') as f:
nok = csv.writer(f,quoting=3,escapechar='*')
nok.writerows(khomun)
ได้
ข้าวหน้าเนื้อวัว,65
ข้าวหน้าเนื้อหมู*,เห็ด*,เป็ด*,ไก่,55
ถ้าไม่ใส่อะไรปกติจะเท่ากับการใส่ quoting เป็น csv.QUOTE_MINIMAL หรือ 0
สรุปตัวเลือกแล้วมี ๔ แบบดังนี้
เลข |
แอตทริบิวต์ |
ความหมาย |
0 |
csv.QUOTE_MINIMAL |
คร่อมเฉพาะเมื่อเจออักษรที่เป็นตัวกั้น |
1 |
csv.QUOTE_ALL |
คร่อมทั้งหมด |
2 |
csv.QUOTE_NONNUMERIC |
คร่อมเฉพาะที่ไม่ใช่ตัวเลข |
3 |
csv.QUOTE_NONE |
ไม่คร่อมเลย |
การทำให้มองข้ามช่องว่างหลังตัวกั้น
ปกติแล้วต่อให้หลังตัวกั้นมีช่องว่าง ช่องว่างนั้นก็จะถูกตีความเป็นส่วนหนึ่งของข้อมูลด้วย
เช่นข้อมูลแบบนี้
ทงคัตสึ, 120
คัตสึดง, 95
ลองอ่านแบบปกติ
with open('raikan_ahan.csv') as f:
khai = csv.reader(f)
for k in khai:
print(k)
จะได้
['ทงคัตสึ', ' 120']
['คัตสึดง', ' 95']
แต่สามารถทำให้มองข้ามช่องว่างหลังตัวกั้นได้โดยกำหนด skipinitialspace=1
with open('raikan_ahan.csv') as f:
khai = csv.reader(f,skipinitialspace=1)
for k in khai:
print(k)
จะได้
['ทงคัตสึ', '120']
['คัตสึดง', '95']
การกำหนดรูปแบบโดยใช้ dialect
ตัวเลือกเสริมต่างๆที่กล่าวมานั้น มีอีกวิธีในการกำหนด ใส่ตัวเลือกเสริม dialect ลงไป
dialect ที่ใช้ได้มี ๓ แบบคือ excel, excel-tab และ unix สามารถดูได้โดยใช้ csv.list_dialects()
print(csv.list_dialects()) # ได้ ['excel', 'excel-tab', 'unix']
โดยที่ excel คือค่าตั้งต้น คือรูปแบบที่กั้นโดยใช้จุลภาคธรรมดา แต่ถ้าหากเลือกเป็น excel-tab จะเป็นการกั้นโดยใช้แท็บ (\t)
เช่น
khomun = [['ยากิโซบะ','焼き蕎麦',99],
['ทาโกะยากิ','蛸焼き',115],
['โอโคโนมิยากิ','御好み焼き',120]]
with open('raikan_ahan.csv','w') as f:
nok = csv.writer(f,dialect='excel-tab')
nok.writerows(khomun)
ได้
ยากิโซบะ 焼き蕎麦 99
ทาโกะยากิ 蛸焼き 115
โอโคโนมิยากิ 御好み焼き 120
ถ้าใช้ dialect เป็น unix ทุกตัวจะถูกคร่อมด้วยเครื่องหมายคำพูด
with open('raikan_ahan.csv','w') as f:
nok = csv.writer(f,dialect='unix')
nok.writerows(khomun)
ได้
"ยากิโซบะ","焼き蕎麦","99"
"ทาโกะยากิ","蛸焼き","115"
"โอโคโนมิยากิ","お好み焼き","120"
ถ้าใช้ csv.get_dialects จะได้ออบเจ็กต์ของ dialect นั้นออกมา ในออบเจ็กต์นั้นมีแอตทริบิวต์ซึ่งบอกว่าค่าใน dialect นั้นตั้งไว้เป็นยังไงบ้าง
lis_attr = ['delimiter','doublequote','escapechar','lineterminator','quotechar','quoting','skipinitialspace','strict']
for samniang in csv.list_dialects():
print('\n=='+samniang+'==')
samniang = csv.get_dialect(samniang)
for att in lis_attr:
print((att,getattr(samniang,att)))
ได้
==excel==
('delimiter', ',')
('doublequote', 1)
('escapechar', None)
('lineterminator', '\r\n')
('quotechar', '"')
('quoting', 0)
('skipinitialspace', 0)
('strict', 0)
==excel-tab==
('delimiter', '\t')
('doublequote', 1)
('escapechar', None)
('lineterminator', '\r\n')
('quotechar', '"')
('quoting', 0)
('skipinitialspace', 0)
('strict', 0)
==unix==
('delimiter', ',')
('doublequote', 1)
('escapechar', None)
('lineterminator', '\n')
('quotechar', '"')
('quoting', 1)
('skipinitialspace', 0)
('strict', 0)
จะเห็นว่าแต่ละตัวก็ไม่ได้ต่างกันมาก แต่เปลี่ยนบ้างค่าเล็กน้อยเท่านั้น ถ้าหากต้องการปรับตัวเลือกเสริมอื่นๆให้ต่างจากค่านี้ก็ใส่ตัวเลือกเสริมนั้นเพิ่มต่อลงไปอีกได้
สร้าง dialect ใหม่ขึ้นเอง
dialect ที่ถูกเตรียมไว้แต่เดิมมีแค่ ๓ แบบดังที่ได้แสดงไป แต่เราก็สามารถสร้างใหม่เพื่อที่ต่อไปหากจะใช้รูปแบบนั้นก็ไม่ต้องใส่ตัวเลือกแบบเดิมซ้ำๆ ใส่แค่ dialect ก็พอ
การสร้างทำได้โดยใช้ฟังก์ชัน csv.register_dialect
ตัวอย่าง
csv.register_dialect('kayu',dialect='unix',delimiter='米',quotechar='弓')
print(csv.list_dialects()) # ได้ ['excel', 'excel-tab', 'unix', 'kayu']
เริ่มจากใส่ชื่อที่ต้องการก่อน จากนั้นตัวเลือก dialect เป็นตัวกำหนดว่าจะใช้ dialect อะไรเป็นฐาน จากนั้นส่วนที่เหลือก็ใส่ไปว่าจะเปลี่ยนแปลงส่วนไหนบ้าง
เมื่อสร้างเสร็จ
พอใช้ csv.list_dialects ก็จะเห็นชื่อที่เราใส่ไปปรากฏขึ้นมา เท่านี้ก็สามารถนำมาใช้ได้เลย
ลองนำมาใช้ดู
khomun = [['ชาดำเย็น',40],
['กาแฟร้อน',50],
['โอเลี้ยง',100]]
with open('raikan_khrueangduem.csv','w') as f:
nok = csv.writer(f,dialect='kayu')
nok.writerows(khomun)
ได้
弓ชาดำเย็น弓米弓40弓
弓กาแฟร้อน弓米弓50弓
弓โอเลี้ยง弓米弓100弓
หากจะแก้ก็ทำได้โดยการสร้างซ้ำโดยใช้ตัวเดิมเป็นฐาน จะแก้เฉพาะตัวที่ระบุเพิ่ม
csv.register_dialect('kayu',dialect='kayu',lineterminator='\r\nかかか粥ゆゆゆ\r\n')
with open('raikan_khrueangduem.csv','w') as f:
nok = csv.writer(f,dialect='kayu')
nok.writerows(khomun)
ได้
弓ชาดำเย็น弓米弓40弓
かかか粥ゆゆゆ
弓กาแฟร้อน弓米弓50弓
かかか粥ゆゆゆ
弓โอเลี้ยง弓米弓100弓
かかか粥ゆゆゆ
ถ้าไม่ต้องการแล้ว การลบออกทำได้โดย csv.unregister_dialect
csv.unregister_dialect('kayu')
csv.unregister_dialect('unix')
print(csv.list_dialects()) # ได้ ['excel', 'excel-tab']
อ้างอิง