web-dev-qa-db-fra.com

Lecture de fichiers délimités par des tabulations avec Pandas - fonctionne sous Windows, mais pas sur Mac

Je lis 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, suivies d'un en-tête.

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

J'essaie maintenant de lire ce fichier avec mon Mac. (La première fois que j'utilise Python sur Mac.) L'erreur suivante s'affiche.

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 à 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 encodage? Il semble que je ne devrais pas avoir à le faire, car la lecture du fichier fonctionne bien sous Windows.

55
user3062149

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 le terminateur de ligne pour csv_reader. Si vous êtes sur un Mac, les lignes créées se termineront par \r plutôt que par le standard Linux \n ou, mieux encore, par les bretelles et la ceinture des fenêtres avec \r\n.

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

Vous pouvez également ouvrir toutes vos données en utilisant le paquet de codecs. Cela peut augmenter la robustesse aux dépens 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')
69
brad sanders

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

1
user3479780