Python、関数から返された辞書のリストを使用する

Aug 19 2020

辞書のリストを返し、それを関数の外で使用しようとしています。

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

         return dataDict    

しかし、t関数を呼び出すと、「ValueError:閉じたファイルでのI / O操作」というエラーが発生します。

myDict = myfunc()

for row in myDict:
    print(row)

辞書のリストをどのように宣言して使用する必要がありますか?辞書が返ってきたら、そのフィールド名にもアクセスする必要があります。ヒントやヘルプは大歓迎です。

回答

1 snakecharmerb Aug 19 2020 at 00:13

with声明は、自動的にファイルを閉じます。withステートメントの外部でDictReaderを介してデータにアクセスしようとすると、DictReaderは閉じたファイルにアクセスできないため、IOErrorが発生します。

関数から戻る前に、ファイルから行をリストに収集することで、これを回避できます。

 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は怠惰です。実際にそれをリストに変えてそれを返すので、ファイルはまだ開いている間に読み取られます。

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

それを別の変数にコピーして、それを返すことができます...

 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  

列名をcsvの列名に置き換えます。