Pozor pri čítaní csv s čiarkou, za ktorou nasleduje medzera v jazyku Python

obchodné

V jazyku Python môžete jednoducho čítať a zapisovať súbory csv pomocou štandardného modulu csv.

Predpokladajme napríklad, že máte nasledujúci súbor csv, sample.csv.

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

To možno vyčítať takto.

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

Pozor si treba dávať na to, aby sa za čiarkou nenachádzala medzera. Za normálnych okolností by za čiarkou nemali byť žiadne zbytočné medzery, ale niekedy vidím súbory s medzerami.

V takýchto prípadoch sa biele znaky štandardne neignorujú a súbor sa číta tak, ako je.

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

Inými slovami, ak prečítate vyššie uvedený súbor s čiarkou nasledovanou medzerou, výstup bude nasledovný

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

Ak v súbore csv.reader zadáte nasledujúce údaje, medzery za čiarkou sa vynechajú.
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 jednoduchom príklade, ako je uvedený vyššie, môžete na odstránenie bielych znakov použiť funkciu strip(). Problém nastáva, keď je obklopený dvojitými úvodzovkami, ako je to v nasledujúcom prípade.

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

Časť obklopená dvojitými úvodzovkami by sa mala považovať za jeden prvok, ale ak je skipinitialspace=False (predvolené nastavenie), bude to vyzerať takto.

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 možno vykonať nastavením 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']

To isté platí aj pri čítaní súboru csv pomocou funkcie read_csv() v programe pandas. Ak má súbor csv za čiarkou medzeru, môžete postupovať takto.
read_csv(skipinitialspace=True)

Copied title and URL