Python, usa un elenco di dizionari restituiti da una funzione

Aug 19 2020

Sto cercando di restituire l'elenco dei dizionari e quindi di utilizzarlo al di fuori della funzione:

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

         return dataDict    

Ma quando chiamo la funzione t, ottengo l'errore "ValueError: operazione di I / O su file chiuso".

myDict = myfunc()

for row in myDict:
    print(row)

Come devo dichiarare e utilizzare un elenco di dizionari? Una volta restituito il dizionario, devo accedere anche ai suoi nomi di campo. Eventuali suggerimenti o aiuto sono molto apprezzati.

Risposte

1 snakecharmerb Aug 19 2020 at 00:13

L' withistruzione chiude automaticamente il file. Quando si tenta di accedere ai dati tramite DictReader al di fuori dell'istruzione with, DictReader non è in grado di accedere al file chiuso e quindi si ottiene l'IOError.

Puoi aggirare questo problema raccogliendo le righe dal file in un elenco prima di tornare dalla funzione:

 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 è pigro. In realtà trasformalo in un elenco e restituiscilo, in modo che il file venga letto mentre è ancora aperto.

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

Potresti copiarlo in un'altra variabile e restituirlo ...

 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  

sostituire i nomi delle colonne con quelli nel file csv.