Suppression des caractères non ascii dans un fichier csv

j'insère actuellement des données dans Mes modèles django en utilisant le fichier csv. Ci-dessous est une fonction de sauvegarde simple qui am en utilisant:

def save(self):
myfile = file.csv
data = csv.reader(myfile, delimiter=',', quotechar='"')
i=0
for row in data:
    if i == 0:
        i = i + 1
        continue    #skipping the header row        

    b=MyModel()
    b.create_from_csv_row(row) # calls a method to save in models

la fonction fonctionne parfaitement avec les caractères ascii. Cependant, si le fichier csv contient des caractères non ascii, une erreur est alors soulevée: UnicodeDecodeError codec "ascii" ne peut pas décoder byte 0x93 en position 1526: ordinal pas dans la gamme(128)

ma question Est: Comment puis-je supprimer les caractères non ascii avant d'enregistrer mon fichier csv pour éviter cette erreur.

Merci d'avance.

4
demandé sur dreftymac 2013-08-30 02:43:47

3 réponses

si vous voulez vraiment le déshabiller, essayez:

import unicodedata

unicodedata.normalize('NFKD', title).encode('ascii','ignore')

* AVERTISSEMENT CECI MODIFIERA VOS DONNÉES * Il tente de trouver une correspondance étroite - à-d. æ -> c

peut-être une meilleure réponse est d'utiliser unicodecsv à la place.

- - - - - modifier ----- OK, si vous ne vous souciez pas que les données soient représentées du tout, essayez ce qui suit:

# If row references a unicode string
b.create_from_csv_row(row.encode('ascii', 'ignore'))

si la ligne est une collection, pas une chaîne unicode, vous aurez besoin pour parcourir la collection du niveau de corde de ré-sérialiser.

6
répondu DivinusVox 2013-08-30 15:29:17

si vous voulez supprimer les caractères non-ascii de vos données puis itérer à travers vos données et ne garder que les ascii.

for item in data:
     if ord(item) <= 128: # 1 - 128 is ascii
          [append,write,print,whatever]

si vous voulez convertir des caractères unicode en ascii, alors la réponse ci-dessus par DivinusVox est exacte.

3
répondu jabgibson 2013-08-29 23:17:54

Pandas csv parser ( http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html ) supporte différents codages:

import pandas
data = pandas.read_csv(myfile, encoding='utf-8', quotechar='"', delimiter=',') 
3
répondu zero323 2013-08-30 00:19:48