Attention à la lecture d’un csv avec une virgule suivie d’un espace en Python

Affaires

En Python, vous pouvez facilement lire et écrire des fichiers csv à l'aide du module standard csv.

Par exemple, supposons que vous ayez le csv suivant, sample.csv.

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

Cela peut être lu comme suit.

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

Ce à quoi vous devez faire attention ici, c'est lorsqu'il y a un espace après la virgule. Normalement, il ne devrait pas y avoir d'espace inutile après la virgule, mais je vois parfois des fichiers contenant des espaces.

Dans ce cas, par défaut, les espaces blancs ne sont pas ignorés et le fichier est lu tel quel.

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

En d'autres termes, si vous lisez le fichier ci-dessus avec une virgule suivie d'un espace, la sortie sera la suivante

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

Si vous spécifiez ce qui suit dans csv.reader, les espaces après la virgule seront ignorés.
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']

Dans un exemple simple comme celui qui précède, vous pouvez utiliser strip() pour supprimer l'espace blanc. Le problème se pose lorsqu'il est entouré de guillemets doubles comme dans l'exemple suivant.

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

La partie entourée de guillemets doubles doit être considérée comme un élément unique, mais si skipinitialspace=False (la valeur par défaut), elle ressemblera à ce qui suit.

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

Cela peut être fait en définissant 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']

Il en va de même lorsque vous lisez un fichier csv avec read_csv() dans pandas. Si le fichier csv comporte un espace après la virgule, vous pouvez procéder comme suit.
read_csv(skipinitialspace=True)