• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z polskimi znakami przy wykonywaniu metod raw_input() oraz write()

+3 głosów
2,699 wizyt
pytanie zadane 6 kwietnia 2015 w Python przez Rubeus024 Obywatel (1,680 p.)
edycja 7 kwietnia 2015 przez Rubeus024

Cześć wszystkim,

Dzisiaj natrafiłem na problem, który na razie mnie przerasta. Naukę języka Python zacząłem niedawno, także proszę o wyrozumiałość :)

Po wpisaniu odpowiedzi, który ma polskie znaki, program wysypuje się program z UnicodeEnconeError. Wcześniej ten problem pojawił się już przy raw_input() (pomogła metoda .decode(sys.stdin.encoding), ), ale błąd pojawia się podczas wykonywania write() . Jak to można rozwiązać?

# -*- coding: utf-8 -*-
import os.path
import sys

path='E:\Programy\Python\Ankieta'
filename=os.path.join(path, 'test.txt')

tekst=open( filename, 'a' )

print u"Napisz cokolwiek z polskimi znakami:",

odpowiedz=raw_input().decode(sys.stdin.encoding)
tekst.write(odpowiedz) #błąd

EDIT: Udało się własnymi siłami, ale zostawię ten post, może ktoś będzie również miał z tym problem. Wynika z niego, że aby wysłać tekst do pliku txt, trzeba zamienić typ stringu z unicode na bitowy. Jeżeli się mylę, to niech ktoś mnie poprawi. A propo tego tematu podrzucam link, który mi pomógł to ogarnąć: http://nedbatchelder.com/text/unipain.html

Edit2. Następnym krokiem było przeczytanie z konsoli tekstu zapisanego na komputerze. Po wielu próbach i ten problem został rozwiązany. Windows PowerShell wykorzystuje kodowanie cp1250 i to trzeba wykorzystać do odczytu z pliku. Kod widoczny na samym dole:

# -*- coding: utf-8 -*-
#przykład działa, gdy plik test.txt jest zapisany w kodowaniu utf-8
import os.path
import sys

path='E:\Programy\Python\Ankieta'
filename=os.path.join(path, 'test.txt')

tekst=open( filename, 'a' )

print u"NApisz cokolwiek z polskimi napisami?",

odpowiedz=raw_input().decode(sys.stdin.encoding)
print type(odpowiedz) #unicode
bit_odpowiedz=odpowiedz.encode('utf-8') 
print type(bit_odpowiedz) #string
tekst.write(bit_odpowiedz)

 

#  -*- coding: utf-8 -*-
#przykład działa, gdy plik test2 zapisany jest w kodowaniu utf-8
import sys
import os.path

path='E:\Programy\Python\Ankieta' 
filename=os.path.join(path, 'test2.txt')

stream=open( filename, 'r' )
tekst=stream.read()
tekst=tekst.decode('cp1250') # Kodowanie zgodne z Windows PowerShell
print tekst

 

2 odpowiedzi

0 głosów
odpowiedź 7 kwietnia 2015 przez TheBan Obywatel (1,400 p.)
U mirosława Zelenta jest odcinek do c++ jak zmienić znaki -podejżewam ,że zadziała też w tym przypadku:)
komentarz 7 kwietnia 2015 przez testerius Pasjonat (23,960 p.)
Ale odcinek dotyczy C++ a nie Pythona.
komentarz 7 kwietnia 2015 przez Rubeus024 Obywatel (1,680 p.)
edycja 7 kwietnia 2015 przez Rubeus024
Ale to co zostało pokazane w filmie tłumaczy problem w sposób uniwersalny i pomogło mi rozwiązać inny kłopot z czytaniem tekstu z Windows PowerShell. Dzięki wiktorsi!
0 głosów
odpowiedź 6 czerwca 2015 przez Kaspero Obywatel (1,920 p.)

Na bazie twojego codu mój program do wczytywania z pliku działa !!


# -*- coding: utf-8 -*-
import os.path
import sys

print u"NApisz cokolwiek z polskimi napisami?",
 
odpowiedz=raw_input().decode(sys.stdin.encoding)
print type(odpowiedz) #unicode
bit_odpowiedz=odpowiedz.encode('utf-8') 

plik = open('test.txt', 'w')
plik.write(bit_odpowiedz)
plik.close()

text = open('test.txt').read()
print text


 

Podobne pytania

0 głosów
1 odpowiedź 2,346 wizyt
0 głosów
1 odpowiedź 2,634 wizyt
0 głosów
0 odpowiedzi 1,007 wizyt
pytanie zadane 21 października 2016 w Python przez adrian313 Bywalec (2,850 p.)

93,695 zapytań

142,613 odpowiedzi

323,225 komentarzy

63,226 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...