csvファイルの辞書への読み込みと検索(2021.7.5)

Summary

以下の処理について動作確認を兼ねたサンプルコードを作成した

CSVファイルから辞書への読み込み

Camma Separated Values (csv)は,で区切られた値を保持するファイル
この例では、user_list.csvというダミーファイルを扱うこととする。
カンマの後にスペースを入れると、空白も要素の文字列の一部と判断されるので注意。

idx,kanji_name,user_id,group_id,channel,num_id,id0,id1,id2,id3,id4
0,関東 太郎,U0123456xxx,T0123xxxxxx,test,3,U0123456zz1,T0123pppppp,B0234500000,,
1,日本 花子,U0123456yyy,T0123xxxxxx,test,3,U0123456zz2,T0123pppppp,B0234000001,,
2,関西 一郎,U0123456ccc,T0123xxxxxx,test,3,U0123456zz3,T0123pppppp,B0234000002,,

次のコードは、csvの1行目のkeyのリストに従って、2行目以降のvalueのリストを辞書への格納する。1行が1つの辞書を形成し、結果として行数-1個の辞書のリストが作られる。

import csv

# open csv file and set values in dictionaly
with open(infilename, newline='', encoding='utf_8_sig') as f:
    reader = csv.DictReader(f)
    data = [row for row in reader]

dataには、keyとvalueがペアで格納された辞書が、複数リストとして収められている。
user_list.csvの例では、keyとvalueの組みを複数持つ辞書が、行ごとのエントリーとしてリストになっているので、リストの要素は3個。

[
{'idx': '0', 'kanji_name': '関東 太郎', 'user_id': 'U0123456xxx', 'group_id': 'T0123xxxxxx', 'channel': 'test', 'num_id': '3', 'id0': 'U0123456zz1', 'id1': 'T0123pppppp', 'id2': 'B0234500000', 'id3': '', 'id4': ''}, 
{'idx': '1', 'kanji_name': '日本 花子', 'user_id': 'U0123456yyy', 'group_id': 'T0123xxxxxx', 'channel': 'test', 'num_id': '3', 'id0': 'U0123456zz2', 'id1': 'T0123pppppp', 'id2': 'B0234000001', 'id3': '', 'id4': ''}, 
{'idx': '2', 'kanji_name': '関西 一郎', 'user_id': 'U0123456ccc', 'group_id': 'T0123xxxxxx', 'channel': 'test', 'num_id': '3', 'id0': 'U0123456zz3', 'id1': 'T0123pppppp', 'id2': 'B0234000002', 'id3': '', 'id4': ''}
]

name = data[0].get('kanji_name')もしくはname= data[0]['kanji_name']とすればkey ’kanji_name’に対応するvalueが得られる。
data[0][‘kanji_name’]で参照すると、keyが存在しない場合には異常終了するが、get()を使うと、keyが存在しない場合にも異常終了とならない。

以下に定義するsearch()関数では、辞書のリストdictsの中から、与えられたkeyとvalueが一致する辞書を全て含むリストを返す。

# define search() for dictionaly
def search(key, value, dicts):
    return [element for element in dicts if element[key] == value]

# search an entry which has 'kanji_name' == given value
# and put the values in a list
found = search('kanji_name', '日本 花子', data)
print(search('kanji_name', '関東 太郎', data))
print(len(found))
print(found[0].get('user_id'))

サンプルプログラム

実行の方法
read_csv_test.py infile.csv

$ read_csv_test.py ./user_list.csv

プログラム:read_csv_test.py
サンプルcsv:users_list.csv

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# =======================================================
#  csvファイルを辞書に読み込むスクリプト
#
#  read_csv_test.py
#  coded by Noboru Harada (noboru@ieee.org)
#
#  Changes:
#  2021/07/04: First version
# =======================================================

import sys
import csv
import json

# parse args
value = sys.argv

if len(value) == 1:
    print("Usage: read_csv_test.py infile.csv")
    sys.exit()

print(value)
infilename = value[1]

# define search() for dictionaly
def search(key, value, dicts):
    return [element for element in dicts if element[key] == value]

# open csv file and set values in dictionaly
with open(infilename, newline='', encoding='utf_8_sig') as f:
    reader = csv.DictReader(f)
    data = [row for row in reader]


# =========================
#  check results
# =========================

print(data)

# show elements in dictionaly
print(data[0]['kanji_name'])
print(data[0].get('kanji_name'))
print(data[0]['user_id'])
print(data[0]['channel'])
print(data[0]['num_id'])
print(data[0]['id0'])
print(data[0]['id1'])
print(data[0]['id2'])
print(data[0]['id3'])
print(data[0]['id4'])
print(data[1]['kanji_name'])
print(data[1]['user_id'])
print(data[1]['channel'])
print(data[1]['num_id'])
print(data[1]['id0'])
print(data[1]['id1'])
print(data[1]['id2'])
print(data[1]['id3'])
print(data[1]['id4'])

# search an entry which has 'kanji_name' == given value
# and put the values in a list
found = search('kanji_name', '日本 花子', data)
print(search('kanji_name', '関東 太郎', data))
print(len(found))
print(found[0].get('user_id'))

参考

Back to Index