web-dev-qa-db-fra.com

ne peut pas lire le fichier JSON avec Python. obtenir une erreur de type: l'objet json est 'TextIOWrapper'

J'essaie de lire un fichier json.

Voici comment j'ai créé le fichier:

import requests
import json
import time
from pprint import pprint

BASE_URL = "https://www.wikiart.org/en/api/2/UpdatedArtists"
artist_json_data = requests.get(BASE_URL).json()

with open('artistdata.json', 'w') as outfile:
    while artist_json_data['hasMore']:
        print(artist_json_data['paginationToken'])
        url = BASE_URL + "?paginationToken=" +artist_json_data['paginationToken']
        artist_json_data = requests.get(url).json()
        json.dump(artist_json_data, outfile, indent=4)
        time.sleep(1)

C'est le début de ma sortie:

{
    "data": [
        {
            "id": "57726da5edc2cb3880b4ca54",
            "artistName": "Paul Feeley",
            "url": "paul-feeley",
            "lastNameFirst": "Feeley Paul",
            "birthDay": "/Date(-1893456000000)/",
            "deathDay": "/Date(-126230400000)/",

Lorsque j'essaie de lire le même fichier avec le code suivant: 

from pprint import pprint

with open('artistdata.json', 'r', encoding='utf-8') as data_file:    
    data = json.loads(data_file)
    pprint(data)

Je reçois l'erreur

TypeError: the JSON object must be str, bytes or bytearray, not 'TextIOWrapper'

que je ne comprends pas, car je peux ouvrir le fichier en sublime comme d’habitude. Comment puis-je gérer cela?

Résolution du problème avec le code suivant:

le problème était que je mélangeais les décharges et la charge. Maintenant, j'utilise dump and load

class Wikiart:
    '''Class to access wikiart.org Data'''
    def __init__(self):
        self.BASE_URL = "https://www.wikiart.org/en/"
        self.BASE_URL_API = self.BASE_URL + "api/2/"
        self.BASE_URL_MOVEMENT = self.BASE_URL + 'artists-by-art-movement/'
        self.ARTIST_DATA_URL = self.BASE_URL_API + "UpdatedArtists"

    def write_artist_data_into_json_file(self):
            artists = requests.get(ARTIST_DATA_URL).json()
            all_artists = artists['data']

            with open('artistdata.json', 'w') as outfile:
                while artists['hasMore']:
                    print('fetching next: pagination token',artists['paginationToken'])
                    url = BASE_URL + "?paginationToken=" + artists['paginationToken']
                    artists_next_page = requests.get(url).json()
                    next_artists = artists_next_page['data']
                    time.sleep(0.25)
                    all_artists = all_artists + next_artists
                    artists = artists_next_page
                json.dump(all_artists, outfile, indent=4)

from pprint import pprint

with open('artistdata.json', 'r', encoding='utf-8') as data_file:    
    data = json.load(data_file)
    pprint(data)
6
zinyosrim

json.load() est pour charger un fichier. json.loads() fonctionne avec des chaînes.

12
zipa

Utilisez json.load() (sans 's') au lieu de json.loads()

PS Vous utiliserez json.load() lors du chargement à partir d’un fichier. Et json.loads() lorsque vous travaillez avec string :)

1
Slick Slime