Aveți grijă când citiți un csv cu o virgulă urmată de un spațiu în Python

Afaceri

În Python, puteți citi și scrie cu ușurință fișiere csv utilizând modulul csv standard.

De exemplu, să presupunem că aveți următorul csv, sample.csv.

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

Aceasta poate fi citită după cum urmează.

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

Aici trebuie să aveți grijă când există un spațiu după virgulă. În mod normal, nu ar trebui să existe spații inutile după virgulă, dar uneori văd fișiere cu spații în ele.

În astfel de cazuri, în mod implicit, spațiile albe nu sunt ignorate, iar fișierul este citit ca atare.

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

Cu alte cuvinte, dacă citiți fișierul de mai sus cu o virgulă urmată de un spațiu, rezultatul va fi următorul

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

Dacă specificați următoarele în csv.reader, spațiile de după virgulă vor fi omise.
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']

Într-un exemplu simplu, precum cel de mai sus, puteți utiliza strip() pentru a elimina spațiile albe. Problema este atunci când acesta este înconjurat de ghilimele duble, cum ar fi următorul exemplu.

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

Partea înconjurată de ghilimele duble ar trebui să fie considerată ca un singur element, dar dacă skipinitialspace=False (valoarea implicită), aceasta va avea următorul aspect.

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

Acest lucru poate fi făcut prin setarea 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']

Același lucru este valabil și atunci când citiți un fișier csv cu read_csv() în pandas. În cazul în care fișierul csv are un spațiu după virgulă, puteți face următoarele.
read_csv(skipinitialspace=True)