Python, utilisez une liste de dictionnaires renvoyés par une fonction

Aug 19 2020

J'essaie de renvoyer la liste des dictionnaires puis de l'utiliser en dehors de la fonction:

 def myfunc():
     fileName: some file on my system
     with open(fileName) as csv1:
         dataDict = csv.DictReader(csv1, delimiter=',')

         return dataDict    

Mais lorsque j'appelle la fonction t, j'obtiens l'erreur "ValueError: opération d'E / S sur fichier fermé".

myDict = myfunc()

for row in myDict:
    print(row)

Comment déclarer et utiliser une liste de dictionnaires? Une fois le dictionnaire renvoyé, je dois également accéder à ses noms de champs. Tout conseil ou aide est grandement apprécié.

Réponses

1 snakecharmerb Aug 19 2020 at 00:13

L' withinstruction ferme automatiquement le fichier. Lorsque vous essayez d'accéder aux données via le DictReader en dehors de l' withinstruction, le DictReader ne peut pas accéder au fichier fermé et vous obtenez ainsi IOError.

Vous pouvez contourner ce problème en rassemblant les lignes du fichier dans une liste avant de revenir de la fonction:

 def myfunc():
     fileName: some file on my system
     with open(fileName) as csv1:
         dataDict = csv.DictReader(csv1, delimiter=',')
         list_of_dicts = list(datadict)
         return list_of_dicts
1 superbrain Aug 18 2020 at 23:50

DictReader est paresseux. En fait, transformez-le en une liste et renvoyez-la pour que le fichier soit lu tant qu'il est encore ouvert.

def myfunc():
     fileName: some file on my system
     with open(fileName) as csv:
         return list(csv.DictReader(csv, delimiter=','))
1 Oin Aug 18 2020 at 23:46

Vous pouvez le copier dans une autre variable et renvoyer cela ...

 def myfunc():
     fileName: some file on my system
     mydict = {}
     with open(fileName) as f: 
         for row in csv.DictReader(f, delimiter=','):
             mydict[row['first_column']] = row['second_column'] + row['third_column']

     return mydict  

remplacez les noms des colonnes par ceux du csv.