Budite oprezni kada čitate csv sa zarezom nakon kojeg slijedi razmak u Pythonu

Poslovanje

U Pythonu možete jednostavno čitati i pisati csv datoteke pomoću standardnog csv modula.

Na primjer, pretpostavimo da imate sljedeći csv, sample.csv.

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

Ovo se može pročitati na sljedeći 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']

Ovdje morate biti oprezni kada postoji razmak iza zareza. Obično ne bi trebalo biti nepotrebnih razmaka iza zareza, ali ponekad vidim datoteke s razmacima.

U takvim slučajevima, prema zadanim postavkama, razmak se ne zanemaruje i datoteka se čita kakva jest.

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

Drugim riječima, ako pročitate gornju datoteku sa zarezom nakon kojeg slijedi razmak, rezultat će biti sljedeći

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

Ako navedete sljedeće u csv.readeru, razmaci iza zareza bit će 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']

U jednostavnom primjeru poput onog iznad, možete koristiti strip() za uklanjanje razmaka. Problem je kada je okružen dvostrukim navodnicima kao što je sljedeći.

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

Dio okružen dvostrukim navodnicima trebao bi se smatrati jednim elementom, ali ako je skipinitialspace=False (zadano), izgledat će ovako.

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 se može učiniti postavljanjem 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']

Isto vrijedi i kada čitate csv datoteku s read_csv() u pandama. Ako csv datoteka ima razmak nakon zareza, možete učiniti sljedeće.
read_csv(skipinitialspace=True)