2016-02-15 1 views
1

Je ne parviens pas à modifier le contenu d'un fichier NamedTemporaryFile après l'avoir créé initialement.Modification du contenu de NamedTemporaryFile (Python 3)

Selon mon exemple ci-dessous, je crée un fichier NamedTemporaryFile à partir du contenu d'une URL (données JSON).

Ensuite, ce que je veux faire est de ré-accéder à ce fichier, modifier une partie du contenu du JSON dans le fichier, et enregistrez-le. Le code ci-dessous est ma tentative de le faire.

import json 
import requests 

from tempfile import NamedTemporaryFile 


def create_temp_file_from_url(url): 
    response = requests.get(url) 
    temp_file = NamedTemporaryFile(mode='w+t', delete=False) 
    temp_file.write(response.text) 
    temp_file.close() 
    return temp_file.name 


def add_content_to_json_file(json_filepath): 
    file = open(json_filepath) 
    content = json.loads(file.read()) 

    # Add a custom_key : custom_value pair in each dict item 
    for repo in content: 
     if isinstance(repo, dict): 
      repo['custom_key'] = 'custom_value' 

    # Close file back ... if needed? 
    file.close() 

    # Write my changes to content back into the file 
    f = open(json_filepath, 'w') # Contents of the file disappears...? 
    json.dumps(content, f, indent=4) # Issue: Nothing is written to f 
    f.close() 

if __name__ == '__main__': 
    sample_url = 'https://api.github.com/users/mralexgray/repos' 

    tempf = create_temp_file_from_url(sample_url) 

    # Add extra content to Temporary file 
    add_content_to_json_file(tempf) 

    try: 
     updated_file = json.loads(tempf) 
    except Exception as e: 
     raise e 

Merci pour l'aide!

Répondre

4

1: Cette ligne:

json.dumps(content, f, indent=4) # Issue: Nothing is written to f 

ne jetez pas content-f. Il crée une chaîne à partir de content, avec la valeur skipkeysf, puis ne fait rien avec.

Vous avez probablement voulu json.dump, sans s ..

2: Cette ligne

updated_file = json.loads(tempf) 

tente de charger un objet JSON à partir du nom de fichier temporaire, ce qui ne va pas travailler. Vous devrez soit lire le fichier sous la forme d'une chaîne, puis utiliser loads, ou rouvrir le fichier et utiliser json.load.

+0

Merci! Cela a résolu mon problème. Petite question d'E/S: Si j'appelle 'content = json.loads (open (json_filepath) .read())', le fichier doit-il être fermé par la suite avant de pouvoir y écrire à nouveau? –