0
votes

Problème lors de la création de plusieurs fichiers json en python pour la boucle

J'essaie de créer plusieurs fichiers JSON en boucle, j'essaye ci-dessous, mais je reçois une erreur ci-dessous

storage_info =({"VolumeType": vol_type,"Size": vol_size,"InstanceId": inst_id,"Encrypted": encryption_status,"AliasName": alias_name})
for s in storage_info:
      filename = 'c:\csv\volume_current_{vol_size}.json'
      with open(filename, "w") as f:
         json.dump(storage_info, f, indent=4, separators=(',', ': '))


0 commentaires

3 Réponses :


1
votes

Vous ne mentionnez pas la bonne clé pour vol_size .

Je suppose que storage_info est une liste de plusieurs dict .

Vous pouvez faire comme ceci:

storage_info = {"VolumeType": vol_type,"Size": vol_size,"InstanceId": inst_id,"Encrypted": encryption_status,"AliasName": alias_name}

filename = 'c:\csv\\volume_current_{}.json'.format(storage_info['Size'])
with open(filename, "w") as f:
    json.dump(storage_info, f, indent=4, separators=(',', ': '))

Si votre storage_info est dict code> lui-même, alors vous devez faire comme ceci pour chaque storage_info que vous obtenez:

storage_info = [{"VolumeType": vol_type,"Size": vol_size,"InstanceId": inst_id,"Encrypted": encryption_status,"AliasName": alias_name}, {"VolumeType": vol_type_one,"Size": vol_size_one,"InstanceId": inst_id_one,"Encrypted": encryption_status_one,"AliasName": alias_name_one}]

for s in storage_info:
      filename = 'c:\csv\\volume_current_{}.json'.format(s['Size'])
      with open(filename, "w") as f:
         json.dump(storage_info, f, indent=4, separators=(',', ': '))


9 commentaires

J'obtiens une erreur filename = 'c: \ csv \ volume_current _ {}. Json'.format (s [' Size ']) TypeError: les indices de chaîne doivent être des entiers


chaque fois en boucle, j'obtiens ce storage_info comme ceci `{'VolumeType': 'gp', 'Size': 2, 'InstanceId': 'xxxxxxxxxxx', 'Encrypted': True, 'AliasName': 'EBS'}


s est {'VolumeType': 'gp', 'Size': 2, 'InstanceId': 'xxxxxxxxxxx', 'Encrypted': True, 'AliasName': 'EBS'} . Droit?


Oui. chaque itération obtiendra tous les volumes un par un comme ci-dessus


Essayé, d'obtenir le même Oserror: [errno 22] argument non valide: 'C: \\ csv \ x0bolume_current_8.json' . hein ... il semble que ce ne semble pas être capable de former chemin ..dont savoir pourquoi :( je l'exécute dans Windows


généralement lorsque j'écris un seul json, j'ouvre comme ceci r "c: \ csv \ name.json", w est-ce nécessaire..confus avec le formatage de la chaîne lors de la création du fichier


ok, maintenant vous obtenez le bon nom et maintenant le problème est d'avoir le bon chemin. Droit?


Non, je viens de dire exemple même j'ai essayé comme ça FileName = 'c: \ csv \ volume_current _ {}. Json'.format (Storage_info ["Taille"]) avec Open (R "{FileName}", "W" ) comme f: . Pas d'erreur, mais sa nette pas de créer des fichiers. pourrait être une erreur idiote que je fais, je ne sais pas où il me manque


un chemin \ in supplémentaire a corrigé le problème `filename = f'c: \ csv \\ volume_current_ {vol_size} .json'`



1
votes

Le problème vient de la variable filename . La variable est statique à une chaîne. Vous pouvez simplement utiliser des littéraux de chaîne f pour résoudre le problème.

Remplacez simplement filename = 'c: \ csv \ volume_current_ {vol_size} .json' par filename = f'c: \ csv \ volume_current_ {vol_size} .json '

et tout devrait fonctionner correctement.

Code complet

storage_info =({"VolumeType": vol_type,"Size": vol_size,"InstanceId": inst_id,"Encrypted": encryption_status,"AliasName": alias_name})
for s in storage_info:
      filename = f'c:\csv\volume_current_{vol_size}.json'
      with open(filename, "w") as f:
         json.dump(storage_info, f, indent=4, separators=(',', ': '))

p>


5 commentaires

essayé d'obtenir la même erreur ... il ne remplace pas correctement le chemin du fichier :(


c: \ csvolume_current_8.json lorsque j'ai essayé d'imprimer le nom du fichier, il semble qu'il y ait un problème avec \ in path


Quelle est la valeur de la variable vol_size ? L'avez-vous déclaré ou l'obtenez-vous à partir de storage_info ? Parce que si vous l'obtenez à partir des dictionnaires stockés dans la variable storage_info , filename = f'c: \ csv \ volume_current_ {s ['vol_size']}. Json ' devrait marcher.


Comment votre nom de fichier a-t-il été modifié à partir de 'C: \\ csv \ x0bolume_current_ {vol_size} .json' à juste c: \ csvoluume_current_8.json . Le comportement attendu était 'c: \\ csv \ volume_current_8.json'


un chemin \ in supplémentaire a corrigé le problème filename = f'c: \ csv \\ volume_current_ {vol_size} .json '



1
votes

J'ai résolu le problème maintenant, tout ce que j'ai fait ajouter un \ dans le chemin ci-dessous. Je ne sais pas si le chemin est correct ou non, il considère maintenant le chemin comme correct

filename = f'c:\csv\\volume_current_{vol_size}.json' 
to   
filename = f'c:/csv/volume_current_{vol_size}.json'

Edit2:

remplacé \ vers / dans le chemin cela fonctionne (un apprentissage que je devrais utiliser /)

for s in storage_info:
    filename = f'c:\csv\\volume_current_{vol_size}.json'
    print(filename)
    with open(filename, "w") as f:
        json.dump(storage_info, f, indent=4, separators=(',', ': '))


0 commentaires