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



การอ่านเขียนไฟล์ csv ด้วย python
เขียนเมื่อ 2019/08/10 08:21


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

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

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
python
-- numpy
-- matplotlib

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

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



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

  ค้นหาบทความ

  บทความแนะนำ

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

ไทย

日本語

中文