I must be doing something obviously wrong here. But what is it, and how do I fix?
Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)
Try:
>>> f1.write(u'bingo') # u specifies unicode
Reference
Have you tried writing a Unicode string, instead of just a str
? I.e.,
fq.write(u"bingo")
I'm on Mac OS X, but when I tried to write a str
, I got the error
TypeError: must be unicode, not str
Writing a Unicode string worked, though.
The io module differs from the old open in that it will make a big difference between binary and text files. If you open a file in text mode, reading will return Unicode text objects (called unicode
in Python 2 and str
in Python 3) and writing requires that you give it unicode objects as well.
If you open in binary mode, you will get 8-bit sequential data back, and that's what you need to write. In Python 2 you use str
for this, in Python 3 bytes
.
You are using Python 2, and trying to write str to a file opened in text mode. That won't work. Use Unicode.
f = open("test.txt", "w")
f.write('bingo')
f.close()
equivalently,
with open("test.txt", "w") as f:
f.write('bingo')
and the termination of the block closes the file for you.
The io
module is a fairly new python module (introduced in Python 2.6) that makes working with unicode files easier. Its documentation is at: http://docs.python.org/library/io.html
If you just want to be writing bytes (Python 2's "str" type) as opposed to text (Python 2's "unicode" type), then I would recommend you either skip the io
module, and just use the builtin "open" function, which gives a file object that deals with bytes:
>>> f1 = open('test.txt','w')
Or, use 'b' in the mode string to open the file in binary mode:
>>> f1 = io.open('test.txt','wb')
Read the docs for the io module for more details: http://docs.python.org/library/io.html