开发者

Writing UTF-8 friendly parsers in python

I wrote a simple file parser and writer, but then I came across an article talking about the importance of unicode and then it occurred to me that I'm assuming the input file is ascii encoded, which may not be the case all the time, though it would be rare in my situation.

In those rare cases, I would expect UTF-8 encoded files.

Is th开发者_如何学Goere a way to work with UTF-8 files by simply changing how I read and write? All I do with the strings is store them and then write them out, so I just need to make sure I can read them, store them, and write them properly.

Furthermore, would I have to treat ascii and UTF-8 files separately and write different functions for each? I have not worked with anything other than ascii files yet and only read about handling unicode.


Python natively supports Unicode. If you directly read and write from the first file to the second, then no data is lost as it copies the bytes verbatim. However, if you decode the string and then re-encode it, you'll need to make sure you use the right encoding.


If you are using Python 2, you can simply change all your str objects to unicode objects. Unicode objects have all the same methods as strings but are encoded in a unicode format instead of ASCII. See http://docs.python.org/library/functions.html#unicode .

If you are using Python 3, strings are encoded in UTF-8 by default.


If you are using Python 2.6 or later, you can use the io library and its io.open method to open the files you want. It has an encoding argument which should be set to 'utf-8' in your case. When you read or write the returned file objects, string are automatically en-/decoded.

Anyway, you don't need to do something special for ASCII, because UTF-8 is a superset of ASCII.


So long as you are only reading and writing to files and not expecting any other type of encoded input, then you should not have to do anything special.

% cat /tmp/u
π is 3.14.

% file /tmp/u
/tmp/u: UTF-8 Unicode text

% cat f.py
f = open('/tmp/u', 'r')
d = f.read()
print d.split()
f.close()

% python f.py 
['\xcf\x80', 'is', '3.14.']

This changes when you declare or accept standard input using UTF-8.

% cat g.py
s = 'π is 3.14.'
print s.split()

% python g.py
  File "g.py", line 1
SyntaxError: Non-ASCII character '\xcf' in file g.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

To handle this properly, declare the encoding for the Python program at the beginning per PEP 263 (referenced by the SyntaxError exception above).

% cat h.py
# -*- coding: utf-8 -*-
s = 'π is 3.14.'
print s.split()

% python h.py
['\xcf\x80', 'is', '3.14.']
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜