Python, use uma lista de dicionários retornada de uma função

Aug 19 2020

Estou tentando retornar a lista de dicionários e usá-la fora da função:

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

         return dataDict    

Mas quando eu chamo a função t, obtenho o erro "ValueError: operação de E / S em arquivo fechado."

myDict = myfunc()

for row in myDict:
    print(row)

Como devo declarar e usar uma lista de dicionários? Assim que o dicionário for retornado, também preciso acessar seus nomes de campo. Qualquer dica ou ajuda é muito apreciada.

Respostas

1 snakecharmerb Aug 19 2020 at 00:13

A withinstrução fecha automaticamente o arquivo. Quando você tenta acessar dados por meio do DictReader fora da withinstrução, o DictReader não consegue acessar o arquivo fechado e, portanto, você obtém o IOError.

Você pode contornar isso reunindo as linhas do arquivo em uma lista antes de retornar da função:

 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 é preguiçoso. Na verdade, transforme-o em uma lista e retorne-a, para que o arquivo seja lido enquanto ainda estiver aberto.

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

Você poderia copiá-lo para outra variável e retornar ...

 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  

substitua os nomes das colunas pelos do csv.