Summary
以下の処理について動作確認を兼ねたサンプルコードを作成した
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
= sys.argv
value
if len(value) == 1:
print("Usage: read_csv_test.py infile.csv")
sys.exit()
print(value)
= value[1]
infilename
# 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:
= csv.DictReader(f)
reader = [row for row in reader]
data
# =========================
# 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
= search('kanji_name', '日本 花子', data)
found print(search('kanji_name', '関東 太郎', data))
print(len(found))
print(found[0].get('user_id'))