Trying to write a cPickle object but get a 'write' attribute type error

Johnliquid picture Johnliquid · Mar 18, 2015 · Viewed 28.5k times · Source

When trying to apply some code I found on the internet in iPython, it's coming up with an error:

TypeError                                 Traceback (most recent call last)
    <ipython-input-4-36ec95de9a5d> in <module>()
     13     all[i] = r.json()
     14 
---> 15 cPickle.dump(all, outfile)

TypeError: argument must have 'write' attribute

Here's what I have done in order:

outfile = "C:\John\Footy Bants\R COMPLAEX MATHS"

Then, I pasted in the following code:

import requests, cPickle, shutil, time

all = {}
errorout = open("errors.log", "w")

for i in range(600):
    playerurl = "http://fantasy.premierleague.com/web/api/elements/%s/"
    r = requests.get(playerurl % i)

    # skip non-existent players
    if r.status_code != 200: continue

    all[i] = r.json()

cPickle.dump(all, outfile)

Here's the original article to give you an idea of what I'm trying to achieve:

http://billmill.org/fantasypl/

Answer

Martijn Pieters picture Martijn Pieters · Mar 18, 2015

The second argument to cPickle.dump() must be a file object. You passed in a string containing a filename instead.

You need to use the open() function to open a file object for that filename, then pass the file object to cPickle:

with open(outfile, 'wb') as pickle_file:
    cPickle.dump(all, pickle_file)

See the Reading and Writing Files section of the Python tutorial, including why using with when opening a file is a good idea (it'll be closed for you automatically).