

次のようなファイルが大量にあります。

#001.json

[code]

    {
        "id": 1,
        "name": "hoge"
    }
    
[/code]

#002.json

[code]

    {
        "id": 2,
        "name": "fuga"
    }
    
[/code]

これらを読み込み、次のようなオブジェクトを作りたいです。

[code]

    [
        {
            "id": 1,
            "name": "hoge"
        },
        {
            "id": 2,
            "name": "fuga"
        }
    ]
    
[/code]

for ループで append していくことで一応達成してはいるのですが、これを簡単に行う方法はありますか

[code]

    files = glob.glob(dir+'*.json')
    print(list(files))
    
    data = []
    for file in files:
        with open(file, 'r') as f:
            data.append(json.load(f))
    print(list(data))
    
[/code]


CC BY-SA 4.0
2020-03-25T14:55:54.370
64116
2020-03-26T12:52:42.933
20885
question
python python3 json jupyter-notebook
複数の json ファイルを読み取り、リストを作成したい


例示のコードで十分簡潔だと感じましたが、2つほどご提案させて頂きます

# 1\. コマンドライン引数から受け取り

  * main.py

[code]

    import sys, json
    
    
    data = []
    for file in sys.argv[1:]:
        with open(file, 'rt') as f:
            data.append(json.load(f))
    
    print(data)
    
[/code]

実行方法

[code]

    $ ls *.json | xargs python main.py
    
[/code]

# 2\. os.listdir を使用

※ワイルドカード指定はできず、ディレクトリ内に読み込みたいJSONファイルしか格納されていない場合にしか使えません。このコードなら glob
を使えば良いと思います…。

[code]

    import os
    
    
    path = 'path/to/dir/'
    
    data = []
    for file in os.listdir(path):  # os.listdir(path+'*.json') はエラー
        with open(file, 'rt') as f:
            data.append(json.load(f))
    
    print(data)
    
[/code]


CC BY-SA 4.0
2020-03-26T05:30:10.953
64124
2020-03-26T05:30:10.953
35754
64116
answer


more_itertools の [with_iter() メソッド](https://more-
itertools.readthedocs.io/en/stable/api.html#more_itertools.with_iter)
を使うと以下の様に書くことができます。

[code]

    import glob
    import json
    from more_itertools import with_iter
    
    dir = './'
    data = [
      json.loads(''.join(list(with_iter(open(f)))))
      for f in sorted(glob.glob(dir+'*.json'))
    ]
    
[/code]

**[with_iter() source code](https://more-
itertools.readthedocs.io/en/stable/_modules/more_itertools/more.html#with_iter)**

[code]

    def with_iter(context_manager):
        """Wrap an iterable in a ``with`` statement, so it closes once exhausted.
        For example, this will close the file when the iterator is exhausted::
            upper_lines = (line.upper() for line in with_iter(open('foo')))
        Any context manager which returns an iterable is a candidate for
        ``with_iter``.
        """
        with context_manager as iterable:
            yield from iterable
    
[/code]

**註**  
コメント欄にも書きましたが、`with_iter()` を使っているのは list comprehension
で解決するためです。質問の意図を考えてみれば、その様な必要性はありませんし、質問者である v..snow
さんが最初に書かれたコードが最も確実で簡単であるかと思います。


CC BY-SA 4.0
2020-03-26T12:52:42.933
64133
2020-03-26T12:52:42.933
64116
answer