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.
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.
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.
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=',')