Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TypeError: expected a character buffer object when doing open()

So I'm learning Python. I was doing a simple thing with arrays and open(), and sometimes this code works, and sometimes it doesn't! Please help!

    print('Load? (Y/N)')
load = raw_input()
if load == "y":
    fin = open("myArr.bat", "r")
    myArr = fin.readline()
if load == "n":
    myArr = [0, 0, 0,
             0, 0, 0,
             0, 0, 0]
if load != "y" and load != "n":
    print 'WUT?'
    exit()

print (myArr[0]) ,  '|' ,  (myArr[1]) ,  '|' ,  (myArr [2])
print '----------'
print (myArr[3]) ,  '|' ,  (myArr[4]) ,  '|' ,  (myArr [5])
print '----------'
print (myArr[6]) ,  '|' ,  (myArr[7]) ,  '|' ,  (myArr [8])
print '_______________________________________________'
print 'What shall I change?'
print 'Number in array: '
foo = raw_input()
doo = int(float(foo))
print 'Number to change to: '
bar = raw_input()
dar = int(float(bar))
myArr[doo] = dar
print '_______________________________________________'
print (myArr[0]) ,  '|' ,  (myArr[1]) ,  '|' ,  (myArr [2])
print '----------'
print (myArr[3]) ,  '|' ,  (myArr[4]) ,  '|' ,  (myArr [5])
print '----------'
print (myArr[6]) ,  '|' ,  (myArr[7]) ,  '|' ,  (myArr [8])
fout = open("myArr.bat", "w")
fout.write(myArr)
fout.close()

Its giving me this :

   Traceback (most recent call last):
  File "Screen.py", line 35, in <module>
    fout.write(myArr)
TypeError: expected a character buffer object

Please help!

like image 822
Thor Correia Avatar asked Dec 01 '22 06:12

Thor Correia


2 Answers

That's because the write method expects a string as the first argument, but you're passing it an array.

like image 97
rid Avatar answered Dec 06 '22 09:12

rid


I'm going to guess that you get this error when you test your code and input 'n', but when you input 'y', it works just fine. This is because of these lines:

if load == "n":
myArr = [0, 0, 0,
         0, 0, 0,
         0, 0, 0]

This makes myArr a list. One does not simply write a list to a file. You must convert it into a string first (only strings can be written to files).

So depending on how you want to store this list in your file, you could do this:

fout = open("myArr.bat", "w")
fout.write(' '.join(map(str, myArr)))
fout.close()

This would essentially write the following line to myArr.bat (assuming myArr = [0, 0, 0, 0, 0, 0, 0, 0, 0]):

0 0 0 0 0 0 0 0 0

Hope this helps

like image 45
inspectorG4dget Avatar answered Dec 06 '22 09:12

inspectorG4dget