105 votes

Impossible de charger l'objet décapé

Le problème que j'ai, c'est que lorsque j'essaie de charger l'application mariné objet. J'ai essayé d'utiliser à la fois pickle.loads y pickle.load Voici les résultats :

pickle.loads :

TypeError : 'str' ne prend pas en charge l'interface tampon

pickle.load :

TypeError : le fichier doit avoir les attributs 'read' et 'readline'.

Quelqu'un peut-il me dire ce que je fais de mal dans ce processus ?

elif str(parser) == "SwissWithdrawn_Parser":
    # swissprot name changes
    print("Gathering SwissProt update info...")
    cache_hits = 0
    cache_misses = 0
    files = set()

    for f in os.listdir("out/cache/"):
        if os.path.isfile("out/cache/" + f):
            files.add(f)

    for name in sp_lost_names:

        cached = False
        url = (
            "http://www.uniprot.org/uniprot/?query=mnemonic%3a"
            + name
            + "+active%3ayes&format=tab&columns=entry%20name"
        )
        hashed_url = str(hash(url))

        ################### For Testing Only - use cache ##################
        if hashed_url in files:
            cached = True
            cache_hits += 1
            content = pickle.loads("out/cache/" + hashed_url)  # <-- problematic line
        else:
            cache_misses += 1
            content = urllib.request.urlopen(url)

        # get the contents returned from the HTTPResponse object
        content_list = [x.decode().strip() for x in content.readlines()]
        if not cached:
            with open("out/cache/" + hashed_url, "wb") as fp:
                pickle.dump(content_list, fp)
        ####################################################################

        # no replacement
        if len(content_list) is 0:
            change_log["swiss-names"] = {name: "withdrawn"}
        # get the new name
        else:
            new_name = content_list[1]
            change_log["swiss-names"] = {name: new_name}

146voto

Martijn Pieters Points 271458

Vous devez soit lire le fichier en premier (sous forme binaire bytes ) et utiliser pickle.loads() ou passer un objet fichier ouvert à la fonction pickle.load() commande. Ce dernier est préférable :

with open('out/cache/' +hashed_url, 'rb') as pickle_file:
    content = pickle.load(pickle_file)

Aucune des deux méthodes ne permet de charger un pickle à partir d'un nom de fichier.

8voto

Kyle Meador Points 83

Si vous portez python2 vers 3 et que vous rencontrez cette erreur, python2 et 3 traitent les octets différemment, ce qui nécessite d'ouvrir le gestionnaire de fichier avec l'option 'b'. Par exemple, dans python2 open(file, 'r') as f: my_list = pickle.load(f) fonctionne, mais pas dans python3. A la place, vous devez ouvrir avec open(file, 'rb') as f: my_list = pickle.load(f)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X