Правильное чтение текста из файла Windows-1252(cp1252) в python

итак, хорошо, поскольку название предполагает, что проблема у меня есть с правильным чтением ввода из файла с кодировкой windows-1252 в python и вставкой указанного ввода в таблицу SQLAlchemy-MySql.

текущая настройка системы:
Windows 7 VM с "системой управления доступом Roger", которая выводит файл;
Ubuntu 12.04 LTS VM с общей папкой в системе Windows, чтобы я мог получить доступ к файлу, используя "Python 2.7.3".

теперь к фактической проблеме, для входного файла У меня есть "общая папка VM", которая содержит файл, который является генератором в системе Windows 7 через систему управления доступом Roger(roger.pl для получения более подробной информации), этот файл называется " предотвращает.csv", который предлагает его содержимое,"; " отдельный список данных.

пример формата данных:

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;

в 4-м поле содержится имя владельца карты, а в 5-м-фамилия владельца, в 6-м-присвоенная группа владельцев.

проблема исходит из факта что любое из 3 вышеупомянутых полей может содержать символы, характерные для латышского языка, в файле примера слово "Jānis" содержит букву "ā", которая в юникоде равна 257.

как я привык, я открываю файл так:

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

пока все работает - он открывает файл, и поэтому я перехожу к итерации по каждой строке файла (это непрерывный скрипт, так что простите цикл):

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(';')

и здесь начинаются проблемы, если я print repr(firstname) печати u'Jxe2nis' что, насколько я понимаю, не правильно - 'xe2 не представляет латышский символ "ā".
Далее по циклу в зависимости от типа события я назначаю переменные объекту SQLAlchemy и insert / update:

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()

в моем поиске ответов я нашел, как определить кодировку по умолчанию для использования:

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

что мне никак не помогло.

в основном, это все приводит к тому, что я не могу вставить правильные владельцы имя / фамилия, а также владельцы назначены groupname, если они содержат какой-либо из латвийских конкретных символов, например:

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

Я также хотел бы добавить, что я не могу изменить "предотвращает.csv "кодировка файлов и система "RACS" не поддерживает вставку в файлы UTF-8 или Unicode - если вы попытаетесь в любом случае, система вставляет случайные символы для латвийских символов.

Пожалуйста, позвольте мне теперь, если нужна любая другая информация, я с радостью дам это :)

любая помощь будет высоко ценится.

2 ответов


CP1252 не может представлять ā; ваш вход содержит аналогичный символ â. repr просто отображает ASCII-представление строки unicode в Python 2.x:

>>> print(repr(b'J\xe2nis'.decode('cp1252')))
u'J\xe2nis'
>>> print(b'J\xe2nis'.decode('cp1252'))
Jânis

Я думаю u'J\xe2nis' правильно, смотри:

>>> print u'J\xe2nis'.encode('utf-8')
Jânis

получаете ли вы фактические ошибки от SQLAlchemy или в выходных данных вашего приложения?