Уведомления

Группа в Telegram: @pythonsu

#1 Март 26, 2013 19:07:55

omatic
Зарегистрирован: 2013-03-24
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 3 utf-8 input/output (unix)

Здравствуйте!

Столкнулся с странной особеностю в Python 3, вроде как по книжке делаю все правильно, а на практике выходить совсем другое, итак суть вопроса:

что установлено: FreeBSD, Python 3.3
два файла кода: test1.py test2.py
файл: data.txt (кодировка utf-8)

test1.py - берет данные с базы(utf-8) и записывает в файл (utf-8). Тут все хорошо, данные читаються с базы в нормальном формате и пишуться в файл в нормальном формате. Вот пример файла:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import mysql.connector, sys
conn = mysql.connector.connect (host = 'localhost', user = 'user', password='password', db='db', charset='utf-8')
cur = conn.cursor()
cur.execute("SELECT ... и т.п.")
file_db = open('/var/tmp/data.txt', 'a', encoding='utf-8')
for row in cur.fetchall():
            file_db.write(("%s\t%s %s,%s\n" % (row[0],row[1],row[2],row[3])))
file_db.close()
cur.close()
 conn.close()

data.txt - файл в кодировке utf-8, с кирилицей, пример файла:
8000	тест 1,1
8001	тест 1,2
8002	тест 1,3
8003	тест 1,4

test2.py - читает данные с файла и выводит на екран в консоль, вот пример файла:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
file_db = open('/var/tmp/ip.txt', 'r', encoding='utf-8')
for fdata in file_db:
    print(fdata)
file_db.close()

Вот с принтом и казус, вроде как бы должен вывести нормально текст, но вместо получаю сообщение:

server# ./test2.py
Traceback (most recent call last):
  File "./test2.py", line 33, in <module>
    print(fdata)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 5-10: ordinal not in range(128)
server#

Что именно не может переварить принт? position 5-10 это какраз слово “тест” в кирилице. Подскажите пожалуйста.

Офлайн

#2 Март 26, 2013 21:40:39

omatic
Зарегистрирован: 2013-03-24
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 3 utf-8 input/output (unix)

Отвечу сам себе, так как нашел причину, все дело в локалях системы.

Пробежался гуглом, и нашел на одном из форумов про Django, комментарий от пользователя xxnikolayxx, за что ему спасибо:

Решение для FreeBSD и других unix-like систем:

Сначало необходимо убедиться, что в операционной системе все в порядке с локациями, вводим:

locale
Команда покажет, какой язык используется системой.
Если переменные LANG и LC_ALL пусты, значит у Вас есть проблемы.
Что делать.
Если у Вас программная оболочка /bin/csh
Нужно выполнить команды:
setenv LC_ALL en_US.UTF-8
setenv LANG en_US.UTF-8

Можете использовать другие локации, их список можно увидеть выполнив команду
locale -a

Поскольку Django работает с кодировкой UTF-8, то лучше поискать свою локацию так:
locale -a | grep UTF-8

Если команда setenv не исполнится в системе, используйте
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

Отредактировано omatic (Март 26, 2013 21:41:54)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version