Python, usa una lista de diccionarios devueltos por una función

Aug 19 2020

Estoy tratando de devolver la lista de diccionarios y luego usarla fuera de la función:

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

         return dataDict    

Pero cuando llamo a la función t, aparece el error "ValueError: operación de E / S en archivo cerrado".

myDict = myfunc()

for row in myDict:
    print(row)

¿Cómo debo declarar y utilizar una lista de diccionarios? Una vez que se devuelve el diccionario, también necesito acceder a sus nombres de campo. Cualquier consejo o ayuda es muy apreciado.

Respuestas

1 snakecharmerb Aug 19 2020 at 00:13

La withdeclaración cierra automáticamente el archivo. Cuando intenta acceder a los datos a través del DictReader fuera de la withdeclaración, DictReader no puede acceder al archivo cerrado, por lo que obtiene el IOError.

Puede evitar esto reuniendo las filas del archivo en una lista antes de regresar de la función:

 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 es vago. De hecho, conviértalo en una lista y devuélvalo, para que el archivo se lea mientras aún está abierto.

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

Podría copiarlo en otra variable y devolver eso ...

 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  

reemplace los nombres de las columnas con los del csv.