LoginSignup
18
27

More than 5 years have passed since last update.

pythonでデータ処理(ファイルから読み込んだり、mongoDBに保存したり)

Last updated at Posted at 2017-12-10

データを扱う作業を行う場合、pythonだとかなりシンプルに実現できるので、まとめます。

大体は下記のケースが多いと思います。
1.ファイルに出力されたデータを読み込む
2.データベースに保存する
3.データベースから読み込む

ここでは、mongoDBの例を挙げます。

ごちゃごちゃ言わずに、まずソースを見たい方はこちらを利用ください

1.ファイルに出力されたデータを読み込む

普通にやると、openして1行ずつ読み込んで、delimiter(区切り文字)で区切って、、と地味に面倒です。
pythonでは、pandas.read_csvライブラリを活用することで非常に簡単に実現できます。(TSVでも他形式でも。sep=**でdelimiter指定します)

import pandas as pd

def save_data_from_file(file_name, delimiter, flg_have_header):
    if flg_have_header:
        pd_dic = pd.read_csv(file_name, sep=delimiter)
    else:
        pd_dic = pd.read_csv(file_name, sep=delimiter, header=None)
    final_dict = [dic for index, dic in pd_dic.to_dict(orient="index").items() if index!=0]
    # 下記は後ほど説明
    save_dict("your collection", final_dict)
  • これだけで、ファイル内容が取得できます(pd_dic: Pandas.DataFrame型)。
  • たとえば、ヘッダーがないファイルを読むこむ場合は、header=Noneをつけます。その他オプションについても細かく指定できます。ドキュメントはこちら

  • 上記は、Dictionary型に変換して利用する例です(final_dict)

2.データベースに保存する

  • 前準備として、mongoDBのインストールがされていることを想定します。(ターミナルで$ mongoで接続できる状態)
  • pymongoというライブラリを利用し、mongoDBへの接続をします。
  • データベース接続情報を用意(セキュリティ的問題から、.gitignoreに追記すべき)
/conf.ini
[mongo]
id=**
password=**
  • pymongo接続関数を作成(configparserでパスワードなどを読み込む)
database.py
import os, sys, configparser
PYMONGO_DIR = os.path.abspath(os.path.dirname(os.path.abspath(__file__)))

def get_db(db_name):
    config = configparser.ConfigParser()
    config.read(PYMONGO_DIR + '/config.ini')
    client = MongoClient('localhost')
    client['admin'].authenticate(config.get('mongo', 'id'), config.get('mongo', 'password'))
    db = client[db_name]
    return db
  • いよいよデータの保存です
  • upsert=Trueで、すでにcolumn_nameに一致するドキュメントがあれば更新、なければinsertできます。
  • 上記で説明した、get_db()でDB接続します
database.py
from pymongo import MongoClient,  DESCENDING

def save_dict(collection_name, dict_objs):
    db = get_db(DICTIONARY_DB)
    coll = db[collection_name]
    for dict_obj in dict_objs:
        coll.update({
            "column_name": dict_obj['column_name']
        },
        dict_obj, upsert=True)
    return

3.データベースから読み込む

  • 例として、特定のcollectionを全件読み込み、pandas.Dataframeにして取得する例です。
database.py
def load_your_dic(collection_name):
    db = get_db(YOUR_DB)
    cursor = db[collection_name].find()
    df = pd.DataFrame.from_dict(list(cursor)).astype(object)
    return df

ソースはこちら

  • ファイルからmongoDBにインストールする場合は、下記のコマンドで実現できます
python init_collections_from_file.py -d"\t" -f **.dic --HEADER Y

[sample]何回も処理する場合はシェルで書くと捗ります
init_politely_dic.sh
18
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
27