pysqlite2: ProgrammingError - Vous ne devez pas utiliser de bytestings 8 bits
Je suis actuellement à la persistance des noms de fichier dans une base de données sqlite pour mes propres fins. Chaque fois que j'essaie d'insérer un fichier qui a un caractère spécial (comme é, etc.), il met l'erreur suivante:
pysqlite2.dbapi2.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings.
Quand je fais "passer mon application sur des chaînes Unicode" par emballage de la valeur envoyée à pysqlite avec l'unicode méthode comme: unicode(filename)
il met cette erreur:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 66: ordinal not in range(128)
Il ya quelque chose que je peux faire pour me débarrasser de cela? La modification de l'ensemble de mes fichiers afin de se conformer n'est pas une option.
Mise à JOUR
Si je décoder le texte via filename.decode("utf-8")
, je suis encore en train de la ProgrammingError ci-dessus.
Mon code ressemble à ceci:
cursor.execute("select * from musiclibrary where absolutepath = ?;",
[filename.decode("utf-8")])
Ce que mon code ici?
source d'informationauteur Naftuli Kay
Vous devez vous connecter pour publier un commentaire.
Vous devez spécifier l'encodage de
filename
pour la conversion en Unicode, par exemple:filename.decode('utf-8')
. Juste à l'aide deunicode(...)
choisit la console de codage, qui est souvent peu fiable (et souventascii
).Vous devez passer en Unicode les arguments de votre instruction SQL.
Maintenant, tout dépend de comment vous obtenir le nom de fichier de la liste. Peut-être que vous êtes en train de lire le système de fichiers à l'aide de
os.listdir
ouos.walk
? Si c'est le cas, il y a un moyen d'avoir directement les noms de fichiers en Unicode juste en passant un Unicode argument de ces fonctions:Exemples:
os.listdir(u'.')
os.walk(u'.')
Bien sûr, vous pouvez remplacer le
u'.'
- répertoire du répertoire courant dont le contenu que vous lisez. Assurez-vous simplement que c'est une chaîne Unicode.Avez-vous essayé de passer la chaîne unicode directement:
Vous aurez besoin d'ajouter de l'encodage de fichier au début du script:
Vous compris cela déjà, mais:
Je ne pense pas que vous pourriez obtenir effectivement que ProgrammingError exception de curseur.execute("select * from musiclibrary où cheminabsolu = ?;", [nom de fichier.decode("utf-8")]), que la question actuellement les états.
Soit l'utf-8 décoder allait exploser, ou le curseur.appel d'exécution serait heureux avec le résultat.
Essayez de changer ce:
Dans votre nom de fichier d'origine de ne pas coder avec
utf8
changementutf8
à votre encodage.