Lire un fichier délimité par des tabulations avec Pandas - fonctionne sous Windows, mais pas sur Mac


91

J'ai lu un fichier de données délimité par des tabulations dans Windows avec Pandas / Python sans aucun problème. Le fichier de données contient des notes dans les trois premières lignes, puis suit avec un en-tête.

df = pd.read_csv(myfile,sep='\t',skiprows=(0,1,2),header=(0))

J'essaye maintenant de lire ce fichier avec mon Mac. (Ma première utilisation de Python sur Mac.) J'obtiens l'erreur suivante.

pandas.parser.CParserError: Error tokenizing data. C error: Expected 1
fields in line 8, saw 39

Si vous définissez l' argument error_bad_lines pour read_csv sur False , j'obtiens les informations suivantes, qui continuent jusqu'à la fin de la dernière ligne.

Skipping line 8: expected 1 fields, saw 39
Skipping line 9: expected 1 fields, saw 125
Skipping line 10: expected 1 fields, saw 125
Skipping line 11: expected 1 fields, saw 125
Skipping line 12: expected 1 fields, saw 125
Skipping line 13: expected 1 fields, saw 125
Skipping line 14: expected 1 fields, saw 125
Skipping line 15: expected 1 fields, saw 125
Skipping line 16: expected 1 fields, saw 125
Skipping line 17: expected 1 fields, saw 125
...

Dois-je spécifier une valeur pour l' argument d' encodage ? Il semble que je ne devrais pas avoir à le faire car la lecture du fichier fonctionne correctement sous Windows.


Utilisez-vous exactement la même version de pandas sur les deux systèmes d'exploitation? Pouvez-vous fournir des exemples de données illustrant le problème sur Mac?
joris

sans rapport: comprenez-vous la différence entre: (0)et (0,)en Python? Remarque: (0)is 0and (0,)is 0,- virgule crée un tuple (sauf un vide), pas des parenthèses.
jfs

Avez-vous essayé df = pd.read_table(myfile, skiprows=[0,1,2], header=0)?
pbreach

Salut à tous. Merci pour les suggestions. J'ai produit une solution temporaire, mais je devrai peut-être revoir ce problème et chercher une meilleure solution à l'avenir. Si et quand je le fais, j'examinerai plus en détail votre suggestion. Ma solution temporaire était de prendre le fichier csv que j'avais (et que j'avais précédemment converti en fichier délimité par des tabulations problématiques à l'aide d'Excel) et de l'enregistrer au format .tsv avec Google docs. J'ai utilisé Gdocs uniquement parce que c'était l'application de documentation la plus pratique qui m'était disponible à l'époque. Cette conversion a fonctionné. Pandas a pu lire correctement le fichier, je crois, et passer au reste de mon code.
user3062149

Je soupçonne que le problème que vous voyez ici avec votre mac est celui des terminateurs de ligne. Les feuilles de calcul créées sur un mac peuvent provoquer toutes sortes de comportements amusants avec diverses bibliothèques, y compris la lib csv_reader en python
Brad Sanders

Réponses:


146

Le plus gros indice est que les lignes sont toutes renvoyées sur une seule ligne. Cela indique que les terminaisons de ligne sont ignorées ou ne sont pas présentes.

Vous pouvez spécifier la terminaison de ligne pour csv_reader. Si vous êtes sur un mac, les lignes créées se termineront par \rplutôt que par le standard Linux \nou mieux encore par l'approche des bretelles et de la ceinture des fenêtres \r\n.

pandas.read_csv(filename, sep='\t', lineterminator='\r')

Vous pouvez également ouvrir toutes vos données à l'aide du package codecs. Cela peut augmenter la robustesse au détriment de la vitesse de chargement des documents.

import codecs

doc = codecs.open('document','rU','UTF-16') #open for reading with "universal" type set

df = pandas.read_csv(doc, sep='\t')

3
L'ajout de codecs m'a aidé. Ensuite, j'ai réalisé qu'il y avait un paramètre dans read_csv qui faisait la même chose. J'ai ajouté encoding = 'utf-16' et cela a résolu le problème pour moi.
Mikhail Venkov

4

Une autre option serait d'ajouter engine='python'à la commandepandas.read_csv(filename, sep='\t', engine='python')

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.