LINUX.ORG.RU

кодировка на выходе

 


0

1

На одном из форумов попросили помощи в скрипте на python. Там нужно было из фразы выкинуть все слова, которые заканчивались на определенную букву. Я попробовал написать код, но столкнулся с бедой кодировки. То есть на англ все работает (Если убрать строку «2»), а на русской - на выходе получается юникод. Никак не могу понять почему. Подскажите как исправить. Python 2.7.3 вот код:

#!/usr/bin/python

# -*- coding: utf-8 -*-

text = raw_input(«Введите фразу: »)

sym = raw_input («Введите букву: »)

text = text.split ()

print text

it = []

for slovo in text:

slovo = list (slovo)

if slovo[-1] != sym:

slovo = "".join (slovo)

it.append (slovo)

print it

Пробовал в терминале:

~ $ python

Python 2.7.3 (default, Aug 1 2012, 05:14:39)

[GCC 4.6.3] on linux2

Type «help», «copyright», «credits» or «license» for more information.

we = «привет все, тест кодировки»

we

'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82 \xd0\xb2 \xd1\x81\xd0\xb5, \xd1\x82\xd0\xb5\xd1\x81\xd1\x82 \xd0\xba \xd0\xbe\xd0\xb4\xd0\xb8\xd1\x80\xd0\xbe\xd0\xb2\xd0\xba \xd0\xb8'

print we

привет все, тест кодировки



Последнее исправление: cetjs2 (всего исправлений: 2)

1. AFAIK, директива # -*- coding: utf-8 -*- должна идти первой в файле. То есть, вместе с хешбангом использовать нельзя.

2. Latin1-кодированная строка - это валидная utf-8 строка. Если ты именно utf-8 имеешь в виду под «юникодом».

schizoid ★★★
()

Запустил этот скрипт:

print it

Это эквивалентно print repr(it). repr() выводит представление объекта в питоне. Это не читабельный текст в общем случае.

Для вывода списков можно сделать так, например:

print ', '.join(it)

А ещё, slovo и так итерируемо, поскольку строка. К списку приводить не надо.

А ещё у str есть метод endswith()...

schizoid ★★★
()

Набросал побыстрому. Сравни со своим.

#!/usr/bin/env python3

text = input('Введите фразу:')
sym = input('Введите букву:')

text = text.split()
found = []

for word in text:
  if word[-1] == sym:
    found.append(word)

print(found)
print('Done')

greek_31 ★★
()
Ответ на: комментарий от greek_31

и сразу фикс, быстро задание прочел.

10c10
<   if word[-1] == sym:
---
>   if word[-1] != sym:
greek_31 ★★
()

ну it, text - списки. Печатай елементи.

l = ['йцукен', 'омг']
print l

['\xd0\xb9\xd1\x86\xd1\x83\xd0\xba\xd0\xb5\xd0\xbd', '\xd0\xbe\xd0\xbc\xd0\xb3']

for x in l: print x
... 
йцукен
омг

crunchy_crow
()
Ответ на: комментарий от greek_31

если бы он пользовался python3 то этого вопроса здесь бы не было, он нормально печатает списки в разных кодировках. Но я согласен что бидлокод)

crunchy_crow
()
Ответ на: комментарий от schizoid

Запустил этот скрипт:

print it

Это эквивалентно print repr(it). repr() выводит представление объекта в питоне. Это не читабельный текст в общем случае.

>>> print it

это равносильно print(str(it)), так как print автоматически дергает метод __str__ объекта, и выведет на печать как раз «читаемое» представление объекта

>>> it
А вот это равносильно тому, что ты написал.

Virtuos86 ★★★★★
()

получается юникод.
Подскажите как исправить.

Наркоман? Так и должно быть. Для вывода в терминал конвертируй в нужную кодировку: .encode('utf8'), например.

anonymous
()
Ответ на: комментарий от schizoid

..... Начинающий еще..... Спасибо

asid
() автор топика
Ответ на: комментарий от greek_31

Проверил, работает, спасибо. Ноо это Вы использовали питон третий. Хотя, что я мозг имею, он же тоже у меня есть....

asid
() автор топика

Для 2 питона.

#! /usr/bin/python
# coding=utf-8

import sys

text = raw_input('Введите фразу:').decode(sys.stdin.encoding)
sym = raw_input('Введите букву:').decode(sys.stdin.encoding)

print ' '.join(filter(lambda x: x[-1]==sym, text.split()))
Баги: любое количество пробельных символов заменяется на один пробел, словом считается любая последовательность непробельных символов, т. е. «все,» — слово, заканчивающееся на ",".

at ★★
()
Ответ на: комментарий от Virtuos86

Виноват, вечно их путаю. Тем более, что в данном случае repr(it) == str(it).

schizoid ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.