Mag-ingat kapag nagbabasa ng csv na may kuwit na sinusundan ng puwang sa Python

Negosyo

Sa Python, madali mong mabasa at maisulat ang mga csv file gamit ang karaniwang csv module.

Halimbawa, ipagpalagay na mayroon kang sumusunod na csv, sample.csv.

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

Mababasa ito sa mga sumusunod.

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']

Ang kailangan mong maging maingat dito ay kapag may puwang pagkatapos ng kuwit. Karaniwan, dapat ay walang mga hindi kinakailangang puwang pagkatapos ng kuwit, ngunit kung minsan ay nakakakita ako ng mga file na may mga puwang sa mga ito.

Sa ganitong mga kaso, bilang default, ang whitespace ay hindi binabalewala at ang file ay binabasa kung ano ang dati.

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

Sa madaling salita, kung babasahin mo ang file sa itaas na may isang kuwit na sinusundan ng isang puwang, ang output ay ang mga sumusunod

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']

Kung tinukoy mo ang sumusunod sa csv.reader, ang mga puwang pagkatapos ng kuwit ay lalaktawan.
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']

Sa isang simpleng halimbawa tulad ng nasa itaas, maaari mong gamitin ang strip() upang alisin ang whitespace. Ang problema ay kapag napapalibutan ito ng dobleng panipi tulad ng sumusunod.

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

Ang bahaging napapalibutan ng dobleng panipi ay dapat ituring bilang isang elemento, ngunit kung skipinitialspace=False (ang default), magiging ganito ang hitsura nito.

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"']

Magagawa ito sa pamamagitan ng pagtatakda ng 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']

Ang parehong ay totoo kapag nagbabasa ng isang csv file na may read_csv() sa pandas. Kung ang csv file ay may puwang pagkatapos ng kuwit, magagawa mo ang sumusunod.
read_csv(skipinitialspace=True)