Wees voorzichtig bij het lezen van een csv met een komma gevolgd door een spatie in Python

Bedrijf

In Python kunt u gemakkelijk csv-bestanden lezen en schrijven met de standaard csv-module.

Bijvoorbeeld, stel je hebt de volgende csv, sample.csv.

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

Dit kan als volgt worden gelezen.

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

Waar je hier op moet letten is wanneer er een spatie achter de komma staat. Normaal zouden er geen onnodige spaties achter de komma moeten staan, maar soms zie ik bestanden met spaties erin.

In dergelijke gevallen worden spaties standaard niet genegeerd en wordt het bestand gelezen zoals het is.

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

Met andere woorden, als je bovenstaand bestand leest met een komma gevolgd door een spatie, zal de uitvoer er als volgt uitzien

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

Als u in csv.reader het volgende opgeeft, worden de spaties na de komma overgeslagen.
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']

In een eenvoudig voorbeeld zoals hierboven, kun je strip() gebruiken om de spaties te verwijderen. Het probleem is wanneer het omgeven is door dubbele aanhalingstekens, zoals het volgende.

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

Het deel omgeven door dubbele aanhalingstekens moet worden beschouwd als een enkel element, maar als skipinitialspace=False (de standaardinstelling), zal het er als volgt uitzien.

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

Dit kan worden gedaan door skipinitialspace=True in te stellen.

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

Hetzelfde geldt voor het lezen van een csv bestand met read_csv() in pandas. Als het csv bestand een spatie na de komma heeft, kun je het volgende doen.
read_csv(skipinitialspace=True)