Правильное чтение текста из файла 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 или в выходных данных вашего приложения?