ระวังเมื่ออ่าน csv ด้วยเครื่องหมายจุลภาคตามด้วยช่องว่างในPython

ธุรกิจ

ใน Python คุณสามารถอ่านและเขียนไฟล์ csv ได้อย่างง่ายดายโดยใช้โมดูล csv มาตรฐาน

ตัวอย่างเช่น สมมติว่าคุณมี csv, sample.csv ต่อไปนี้

11,12,13,14
21,22,23,24
31,32,33,34

สามารถอ่านได้ดังนี้

import csv

with open('data/src/sample.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
# ['11', '12', '13', '14']
# ['21', '22', '23', '24']
# ['31', '32', '33', '34']

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

ในกรณีดังกล่าว ตามค่าเริ่มต้น ช่องว่างจะไม่ถูกละเว้น และไฟล์จะถูกอ่านตามที่เป็นอยู่

11, 12, 13, 14
21, 22, 23, 24
31, 32, 33, 34

กล่าวอีกนัยหนึ่ง หากคุณอ่านไฟล์ด้านบนด้วยเครื่องหมายจุลภาค ตามด้วยช่องว่าง ผลลัพธ์จะเป็นดังนี้

with open('data/src/sample_space.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
# ['11', ' 12', ' 13', ' 14']
# ['21', ' 22', ' 23', ' 24']
# ['31', ' 32', ' 33', ' 34']

หากคุณระบุสิ่งต่อไปนี้ใน csv.reader ช่องว่างหลังเครื่องหมายจุลภาคจะถูกข้าม
skipinitialspace=True

with open('data/src/sample_space.csv', 'r') as f:
    reader = csv.reader(f, skipinitialspace=True)
    for row in reader:
        print(row)
# ['11', '12', '13', '14']
# ['21', '22', '23', '24']
# ['31', '32', '33', '34']

ในตัวอย่างง่ายๆ เช่นตัวอย่างด้านบน คุณสามารถใช้ strip() เพื่อลบช่องว่าง ปัญหาคือเมื่อล้อมรอบด้วยเครื่องหมายอัญประกาศคู่ดังต่อไปนี้

"one,one", "two,two", "three,three"

ส่วนที่ล้อมรอบด้วยเครื่องหมายอัญประกาศคู่ควรถือเป็นองค์ประกอบเดียว แต่ถ้า skipinitialspace=False (ค่าเริ่มต้น) จะมีลักษณะดังนี้

with open('data/src/sample_double_quotation.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
# ['one,one', ' "two', 'two"', ' "three', 'three"']

สามารถทำได้โดยการตั้งค่า skipinitialspace=True

with open('data/src/sample_double_quotation.csv', 'r') as f:
    reader = csv.reader(f, skipinitialspace=True)
    for row in reader:
        print(row)
# ['one,one', 'two,two', 'three,three']

เช่นเดียวกับเมื่ออ่านไฟล์ csv ด้วย read_csv() ในแพนด้า หากไฟล์ csv มีช่องว่างหลังเครื่องหมายจุลภาค ให้ทำดังนี้
read_csv(skipinitialspace=True)