2010-08-27 4 views
3

J'ai un db sqlite qui a des caractères ascii fous dedans et je voudrais les enlever, mais je n'ai aucune idée de comment s'y prendre. J'ai googlé quelques trucs et j'ai trouvé des gens qui disaient utiliser REGEXP avec mysql, mais ça a jeté une erreur en disant que REGEXP n'était pas reconnu.sqlite supprimer non utf-8 caractères

Voici l'erreur que je reçois:

sqlalchemy.exc.OperationalError: (OperationalError) Could not decode to UTF-8 column 'table_name' with text ... 

Merci pour l'aide

+2

Etes-vous sûr de vouloir vous débarrasser des personnages "fous"? Apprendre à gérer tous les caractères Unicode est vraiment amusant ... – unutbu

+0

sont donc des caractères ASCII ou UTF-8? Puisque vous utilisez SQLAlchemy, il gère déjà UTF-8, mais vous êtes probablement confus sur ce qu'il faut faire une fois que vous l'avez obtenu. http://docs.python.org/howto/unicode.html – msw

+1

~ unutbu: dépend de votre définition de "fun";) Je l'appellerais certainement "utile" et "d'abord intimidant", et "utile" mais " amusant "n'a jamais traversé mon esprit. – msw

Répondre

1

Eh bien, si vous voulez vraiment shoehorn une riche chaîne de caractères Unicode dans une chaîne ascii (et ne me dérange pas quelques gaffes), vous pouvez utiliser ceci:

import unicodedata as ud 
def shoehorn_unicode_into_ascii(s): 
    # This removes accents, but also other things, like ß‘’“” 
    return ud.normalize('NFKD', s).encode('ascii','ignore') 

Pour une solution plus complète (avec goofs un peu moins, mais nécessitant un module tiers unidecode), see this answer. Vraiment, cependant, la meilleure solution est de travailler autant que possible avec les données Unicode dans tout votre code, et de ne passer à un codage que lorsque cela est nécessaire.

+0

Je cherchais en fait une déclaration sql que je pourrais utiliser alors je n'ai pas à faire avec. J'ai déjà essayé cette fonction: def removeNonAscii (s): return "" .join (i for i dans s si ord (i) <128) et je reçois toujours l'erreur parce que ça se passe quand je fais le select dans SQLAlchemy je pense . – imns

+0

@bababa: Pouvez-vous dessiner le texte avec une instruction SQL SELECT simple comme 'SELECT * from table'? Si c'est le cas, il ne serait pas difficile d'écrire un script unique à lire dans les données, et d'utiliser 'UPDATE's pour réécrire les données ascii ... Très bas, mais opportun. – unutbu

+0

hmmm, c'est une bonne idée, laissez-moi l'essayer. – imns

0

possède un ensemble de fonctions de codage et de décodage Unicode robustes.

Questions connexes