Bodite previdni pri branju csv z vejico, ki ji sledi presledek v programu Python

Posel

V Pythonu lahko preprosto berete in pišete datoteke csv z uporabo standardnega modula csv.

Predpostavimo, da imate na primer naslednji csv, sample.csv.

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

To lahko preberemo na naslednji način.

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

Pri tem morate biti pozorni, če je za vejico presledek. Običajno za vejico ne bi smelo biti nepotrebnih presledkov, vendar včasih vidim datoteke s presledki.

V takih primerih se beli presledki privzeto ne upoštevajo in datoteka se prebere takšna, kot je.

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

Z drugimi besedami, če zgornjo datoteko preberete z vejico, ki ji sledi presledek, bo rezultat naslednji

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

Če v csv.reader navedete naslednje, bodo presledki za vejico preskočeni.
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']

V preprostem primeru, kot je zgornji, lahko s funkcijo strip() odstranite bele prostore. Težava nastane, ko je ta obkrožen z dvojnimi narekovaji, kot v naslednjem primeru.

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

Del, obdan z dvojnimi narekovaji, je treba obravnavati kot en sam element, če pa je skipinitialspace=False (privzeto), bo videti takole.

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

To lahko storite tako, da nastavite 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']

Enako velja za branje datoteke csv s funkcijo read_csv() v programu pandas. Če ima datoteka csv za vejico presledek, lahko naredite naslednje.
read_csv(skipinitialspace=True)