4 votes

Pandas : erreur lors de la lecture d'un fichier CSV avec les arguments `sep` et `comment`.

Situation

Je dois créer un dataframe pandas à partir d'un fichier de type CSV qui présente les caractéristiques suivantes :

  • Le délimiteur utilisé par le fichier peut être soit une virgule, soit un espace, et je ne sais pas à l'avance lequel des deux aura le fichier.
  • En haut du fichier, il peut y avoir une ou plusieurs lignes de commentaires, qui commencent par # .

Problème

J'ai essayé d'aborder ce problème avec le pd.read_csv méthode avec des arguments sep=None y comment='#' . D'après ce que j'ai compris, le sep=None indique à pandas d'auto-détecter le caractère de délimitation et l'argument comment='#' indique à pandas que toutes les lignes commençant par # sont des lignes de commentaires qui doivent être ignorées.

Ces arguments fonctionnent bien lorsqu'ils sont utilisés individuellement. Cependant, lorsque je les utilise tous les deux ensemble, je reçois le message d'erreur suivant TypeError: expected string or bytes-like object . L'exemple de code suivant le démontre :

from io import StringIO
import pandas as pd

# Simulated data file contents
tabular_data = (
    '# Data generated on 04 May 2017\n'
    'col1,col2,col3\n'
    '5.9,7.8,3.2\n'
    '7.1,0.4,8.1\n'
    '9.4,5.4,1.9\n'
)

# This works
df1 = pd.read_csv(StringIO(tabular_data), sep=None)
print(df1)

# This also works
df2 = pd.read_csv(StringIO(tabular_data), comment='#')
print(df2)

# This will give an error
df3 = pd.read_csv(StringIO(tabular_data), sep=None, comment='#')
print(df3)

Malheureusement, je ne comprends pas vraiment ce qui déclenche l'erreur. Quelqu'un ici pourrait-il m'aider à résoudre ce problème ?

4voto

MaxU Points 5284

Essayez ça :

In [186]: df = pd.read_csv(StringIO(tabular_data), sep=r'(?:,|\s+)',
                           comment='#', engine='python')

In [187]: df
Out[187]:
   col1  col2  col3
0   5.9   7.8   3.2
1   7.1   0.4   8.1
2   9.4   5.4   1.9

'(?:,|\s+)' - est une RegEx permettant de sélectionner une virgule ou un nombre quelconque d'espaces/tabulations consécutifs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X