2017-06-02 6 views
1

Je csv avec l'analyse d'une délimiteurs multi-char en pandas géants comme suitpandas géants séquence d'échappement non valide après la mise à jour

big_df = pd.read_csv(os.path.expanduser('~/path/to/csv/with/special/delimiters.csv'), 
        encoding='utf8', 
        sep='\$\$><\$\$', 
        decimal=',', 
        engine='python') 
big_df.iloc[:, -1] = big_df.iloc[:, -1].str.replace('\$\$>$', '') 
big_df = big_df.replace(['^<', '>$'], ['', ''], regex=True) 

big_df.columns = big_df.columns.to_series().replace(['^<', '>$', '>\$\$'], ['', '', ''], regex=True) 

cela a bien fonctionné jusqu'à ce que je mets à jour récemment mon installation de pandas géants. Maintenant, je vois beaucoup d'avertissements de désapprobation:

<input>:3: DeprecationWarning: invalid escape sequence \$ 
<input>:3: DeprecationWarning: invalid escape sequence \$ 
<input>:3: DeprecationWarning: invalid escape sequence \$ 
<input>:3: DeprecationWarning: invalid escape sequence \$ 
<input>:3: DeprecationWarning: invalid escape sequence \$ 
<ipython-input-6-1ba5b58b9e9e>:3: DeprecationWarning: invalid escape sequence \$ 
    sep='\$\$><\$\$', 
<ipython-input-6-1ba5b58b9e9e>:7: DeprecationWarning: invalid escape sequence \$ 
    big_df.iloc[:, -1] = big_df.iloc[:, -1].str.replace('\$\$>$', '') 

Comme je l'ai besoin des délimiteurs spéciaux avec les $ symboles Je ne suis pas sûr comment gérer correctement ces avertissements

+0

Utilisez des chaînes brutes: 'r \ $ \ $><$ \ $ \ '' etc. Cette chaîne de façon échapper et se échappe regex ne gênent pas. –

+0

Merci, c'est déjà la réponse. Si vous voulez vous sentir libre de poster comme une réponse. –

+0

Merci. J'allais refuser, mais cette dépréciation semble être une chose assez nouvelle, je trouve surtout des problèmes de github pour des bibliothèques telles que jinja, scikit, sympy, etc; tout de la semaine dernière ou plus. –

Répondre

2

Depuis après quelques googler rapide, je ne pouvais pas trouver un la cible dupe évidente, je vais ajouter une bonne réponse. Le problème est que l'échappement dans les chaînes peut interférer avec l'échappement dans les chaînes regex. Alors que '\s' est un jeton regex valide, pour python cela représenterait un caractère spécial qui n'existe pas (la chaîne littérale '\s' est automatiquement convertie en '\\s' soit r'\s', et je suspecte que ce processus est ce qui a été déprécié, apparemment, de python 3.6).

Le but est de toujours utiliser des chaînes brutes lors de la construction de regexen, afin de s'assurer que python ne soit pas perturbé par les antislashs. Alors que la plupart des frameworks utilisés pour gérer cette ambiguïté sont très bien (je suppose en ignorant les séquences d'échappement invalides), des versions apparemment plus récentes de certaines bibliothèques essayent de forcer les programmeurs à être explicites et non ambigus.

En vous cas précis, vos motifs doivent être changés, disons, '\$\$><\$\$'-r'\$\$><\$\$':

big_df.iloc[:, -1] = big_df.iloc[:, -1].str.replace(r'\$\$>$', '') 

Ce qui se passe en réalité est que les antislashs eux-mêmes doivent échapper à python, afin d'avoir une longueur littérale -2 '\$' chaîne dans votre modèle regex:

>>> r'\$\$><\$\$' 
'\\$\\$><\\$\\$'