φυβλαςのβλογ
บล็อกของ phyblas



การอ่านเขียนไฟล์ csv ด้วย python
เขียนเมื่อ 2019/08/10 08:21
แก้ไขล่าสุด 2024/02/22 10:40


ไฟล์ 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']



อ้างอิง




-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
ภาษา javascript
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  ค้นหาบทความ

  บทความแนะนำ

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

บทความแต่ละเดือน

2024年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文