Python, use uma lista de dicionários retornada de uma função
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
A with
instrução fecha automaticamente o arquivo. Quando você tenta acessar dados por meio do DictReader fora da with
instruçã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
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=','))
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.