Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: What is the correct way to port codecs.open to python 3.1?

4 views
Skip to first unread message

MRAB

unread,
Nov 7, 2009, 8:11:47 AM11/7/09
to pytho...@python.org
Baptiste Lepilleur wrote:
> After applying 2to3.py to port a 2.6 script to 3.1, I get the following
> error when running my script:
> File "purekeyworddbtest.py", line 143, in __init__
> f = codecs.open(EXCLUDED_KEYWORDS_FILE, 'rt', 'utf-8')
> File "c:\Python31\lib\codecs.py", line 870, in open
> file = builtins.open(filename, mode, buffering)
> ValueError: can't have text and binary mode at once
>
> I skimmed through python 3.0 release notes, and I haven't seen anything
> indicating that codecs.open behaviour has changed in incompatible way
> (just that it is no longer useful). Have I missed something?
>
> Do I need to replace all codecs.open with the built-in open function? If
> so, why does codecs.open still exist?
>
The documentation says of codecs.open() that "Files are always opened in
binary mode, even if no binary mode was specified", but you've given the
mode as 'rt', so you're asking it to open the file both in text mode
_and_ binary mode. This is the same as in Python 2.6.

If it works in 2.6 but not in 3.1, perhaps it's just that in 2.6 it
ignores the 't' whereas in 3.1 it complains.

Antoine Pitrou

unread,
Nov 7, 2009, 1:10:24 PM11/7/09
to pytho...@python.org
Le Sat, 07 Nov 2009 12:56:54 +0100, Baptiste Lepilleur a écrit :
>
> After applying 2to3.py to port a 2.6 script to 3.1, I get the following
> error when running my script:
> File "purekeyworddbtest.py", line 143, in __init__
> f = codecs.open(EXCLUDED_KEYWORDS_FILE, 'rt', 'utf-8')
> File "c:\Python31\lib\codecs.py", line 870, in open
> file = builtins.open(filename, mode, buffering)
> ValueError: can't have text and binary mode at once

I would suggest not using codecs.open() in 3.x, since the built-in open()
will do the same thing, but faster.

So just write:
f = open(EXCLUDED_KEYWORDS_FILE, 'r', encoding='utf-8')
and you'll get a fast file object giving you str (unicode) objects after
an implicit utf-8 decoding of file data.

Regards

Antoine.

0 new messages