Jak zapisać ciągi unicode do pliku? [duplikat]
To pytanie ma już odpowiedź tutaj:
- zapisywanie tekstu Unicode do pliku tekstowego? 7 odpowiedzi
Używam Pythona 2.6.5 Chcę napisać kilka japońskich znaków do pliku. Dostaję ten błąd i nie wiem, jak zmienić kodowanie.
Python 2.6.5 (r265:79063, Jun 12 2010, 17:07:01)
[GCC 4.3.4 20090804 (release) 1] on cygwin
>>> s = u'\u5E73\u621015'
>>> with open("yop", "wb") as f:
... f.write( s + "\n" );
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1:
ordinal not in range(128)
>>> type( s )
<type 'unicode'>
48
Author: Frankie Ribery, 2011-03-30
4 answers
Będziesz musiał "zakodować" ciąg znaków unicode.
s = u'\u5E73\u621015'
with open("yop", "wb") as f:
f.write(s.encode("UTF-8"))
Wypróbuj to dla trochę przyjaznego spojrzenia na unicode i python: http://farmdev.com/talks/unicode/
73
Author: Mike Ramirez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-30 07:59:57
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-30 07:59:57
Jako alternatywę możesz użyć modułu codecs
:
import codecs
s = u'\u5E73\u621015'
with codecs.open("yop", "w", encoding="utf-8") as f:
f.write(s)
71
Author: Philipp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-30 12:55:01
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-30 12:55:01
Kodeki.funkcja open () w 2.6 jest bardzo podobna do wbudowanej funkcji open () w python3.x (co ma sens, ponieważ ciągi Py3k są zawsze Unicode). W celu przyszłej korekty kodu w przypadku, gdy jest on używany pod Py3k, możesz wykonać następujące czynności.
import sys
if sys.version_info[0] < 3:
import codecs
_open_func_bak = open # Make a back up, just in case
open = codecs.open
with open('myfile', 'w', encoding='utf-8') as f:
f.write(u'\u5E73\u621015')
Teraz Twój kod powinien działać tak samo w obu 2.x i 3,3+.
9
Author: eestrada,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-09 03:59:33
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-09 03:59:33
Wstawienie tego na początku mojego skryptu rozwiązuje problemy z unicode.
import sys
reload(sys)
sys.setdefaultencoding('utf8')
3
Author: petra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-02 13:51:36
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-02 13:51:36