Tenha cuidado ao ler um csv com uma vírgula seguida de um espaço em Python

O negócio

Em Python, pode facilmente ler e escrever ficheiros csv usando o módulo csv padrão.

Por exemplo, suponha que tem o seguinte csv, sample.csv.

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

Isto pode ser lido como se segue.

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

O que é preciso ter cuidado aqui é quando há um espaço após a vírgula. Normalmente, não deve haver espaços desnecessários após a vírgula, mas por vezes vejo ficheiros com espaços neles.

Nesses casos, por defeito, o espaço em branco não é ignorado e o ficheiro é lido tal como está.

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

Por outras palavras, se ler o ficheiro acima com uma vírgula seguida de um espaço, a saída será a seguinte

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

Se especificar o seguinte no csv.reader, os espaços após a vírgula serão ignorados.
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']

Num exemplo simples como o anterior, pode usar a strip() para remover o espaço em branco. O problema é quando está rodeado por aspas duplas, como as seguintes.

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

A parte rodeada por aspas duplas deve ser considerada como um único elemento, mas se skipinitialspace=False (o padrão), parecerá o seguinte.

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

Isto pode ser feito através da definição de 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']

O mesmo é verdade quando se lê um ficheiro csv com read_csv() em pandas. Se o ficheiro csv tiver um espaço após a vírgula, pode fazer o seguinte.
read_csv(skipinitialspace=True)