Lecture correcte du texte du fichier Windows-1252 (cp1252) en python

donc d'accord, comme le suggère le titre, le problème que j'ai est correctement lire les entrées à partir d'un windows-1252 fichier codé en python et de l'insertion de ladite entrée en SQLAlchemy-table MySql.

La configuration actuelle du système:
Windows 7 VM avec "Roger Système de Contrôle d'Accès" qui sort le fichier;
Ubuntu 12.04 LTS VM avec un dossier partagé pour le système Windows afin que je puisse accéder au fichier, à l'aide de "Python 2.7.3".

Maintenant pour le problème réel, pour le fichier d'entrée, j'ai une "VM dossier partagé" qui contient un fichier qui est genereate sur un système Windows 7 par Roger Système de Contrôle d'Accès(roger.pl pour plus de détails), ce fichier est appelé "Empêche.csv", qui suggère à son contenu, un ";" séparés de la liste de données.

Un exemple de format de données:

2013-03-19;15:58:30;100;Jānis;Dumburs;1;Uznemums1;0;Ieeja;
2013-03-19;15:58:40;100;Jānis;Dumburs;1;Uznemums1;2;Izeja;

Le 4ème champ contient la carte, le nom des propriétaires et 5e contient les propriétaires lastname, le 6 contient les propriétaires de groupe attribué.

Le problème vient du fait que l'un quelconque des 3 zones mentionnées ci-dessus peut contenir des caractères spécifiques à la langue lettone, dans le fichier d'exemple le mot "Jānis" contient la lettre "à" qui en unicode est 257.

Comme je suis, j'ai ouvert le fichier en tant que tel:

try:
    f = codecs.open(file, 'rb', 'cp1252')
except IOError:
    f = codecs.open(file, 'wb', 'cp1252')

Jusqu'à présent, tout fonctionne - il ouvre le fichier et j'ai donc passer à répéter sur chaque ligne du fichier(ce est une perpetuelle d'exécuter le script, de sorte pardon de la boucle):

while True:
    line = f.readline()

    if not line:
        # Pause loop for 1 second
        time.sleep(1)
    else:
        # Split the line into list
        date, timed, userid, firstname, lastname, groupid, groupname, typed, pointname, empty = line.split(';')

Et c'est là que les problèmes commencent, si je print repr(firstname) il imprime u'J\xe2nis' qui est, comme je le comprenons, n'est - il correct, `\xe2\ ne représente pas le letton caractère "ā".
Plus bas dans la boucle en fonction du type d'événement que j'affecter les variables à SQLAlchemy objet et insertion/mise à jour:

if typed == '0':  # Entry type
    event = Events(
        period,
        fullname,
        userid,
        groupname,
        timestamp,
        0,
        0
    )
    session.add(event)
else:  # Exit type
    event = session.query(Events).filter(
        Events.period == period,
        Events.exit == 0,
        Events.userid == userid
    ).first()
    if event is not None:
        event.exit = timestamp
        event.spent = timestamp - event.entry

# Commit changes to database
session.commit()

Dans ma recherche de réponses, j'ai trouvé comment définir l'encodage par défaut à utiliser:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

Qui n'a pas aidé moi en quelque sorte.

Fondamentalement, c'est tout pour le moi de ne pas être en mesure d'insérer le bon de propriétaires prénom et le nom ainsi que les propriétaires affectés groupname si elles contiennent un letton des caractères spécifiques, par exemple:

Instead of the character "ā" it inserts "â"

J'aimerais aussi ajouter que je ne peux pas changer le "Empêche.csv" un fichier de codage et le "RAC" le système ne prend pas en charge de l'insertion en UTF-8 ou Unicode fichiers - si vous essayez de toute façon, le système insère les symboles aléatoires pour le letton des caractères spécifiques.

S'il vous plaît laissez-moi maintenant si d'autres informations sont nécessaires, je fournirai avec plaisir 🙂

Toute aide serait très appréciée.

source d'informationauteur Krisjanis Zvaigzne