web-dev-qa-db-fra.com

Essayer d'écrire un objet cPickle mais d'obtenir une erreur de type d'attribut «écriture»

Lorsque j'essaie d'appliquer du code que j'ai trouvé sur Internet dans iPython, cela génère une erreur:

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

Voici ce que j'ai fait dans l'ordre:

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

Ensuite, j'ai collé le code suivant:

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)

Voici l'article original pour vous donner une idée de ce que j'essaie de réaliser:

http://billmill.org/fantasypl/

19
Johnliquid

Le deuxième argument de cPickle.dump() doit être un objet fichier . Vous avez plutôt passé une chaîne contenant un nom de fichier.

Vous devez utiliser la fonction open() pour ouvrir un objet fichier pour ce nom de fichier, puis passer l'objet fichier à cPickle:

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

Voir la section Lecture et écriture de fichiers du didacticiel Python, y compris pourquoi utiliser with lors de l'ouverture d'un fichier est une bonne idée (il sera fermé automatiquement pour vous).

32
Martijn Pieters