2016-05-24 1 views
0

fetchone()をdict_factory関数で、タプルではなく辞書に変更したので、これは間違っていると思うが、それを辞書にしたいだけで、値をリストにキーに追加したいループ内でfetchone()を使用して値のリストに値を追加するにはどうすればよいですか?

def dict_factory(cursor, row): 
    d = {} 
    for idx, col in enumerate(cursor.description): 
     d[col[0]] = row[idx] 
    return d 

def open_sql(sql_folder, sql_name, sql_table): 
    # databases are located at /work/jmjohnso1/db_project 
    path_name = os.path.join(sql_folder,sql_name).strip() 
    con = lite.connect(path_name) 
    con.row_factory = dict_factory 
    cur = con.cursor() 
    cur.execute('SELECT * FROM ' + sql_table) 

    dict_contents = defaultdict(list) 
    while cur.fetchone() != None: 
     cur.fetchone() 
     for k, v in cur.fetchone(): 
      dict_contents[k].append(v) 
    con.close() 
    pprint(dict_contents) 
    return dict_contents 

所望の出力:

{'atime': [1141682141, 1141682142], 
    'attr_id': [3, 2] 
    } 

Iを取得エラー:

 for k, v in cur.fetchone(): 
    ValueError: too many values to unpack (expected 2) 

コード全体

# python3.5 
    # pymongo version 3.2.2 
    # MongoDB shell version: 3.0.11 


    import os 
    import pymongo 
    from pymongo import MongoClient 
    import sqlite3 as lite 
    import pyewf 
    import hashlib 
    from itertools import chain 
    from collections import defaultdict 
    import pprint 

    def list_sql_db(folder): 
     # need a list for multiprocessing so I made a file. 
     file_name = os.path.join(folder, 'sql_db') 
     if not os.path.isfile(file_name): 
      with open (file_name, 'w') as line: 
       for (dirpath, dirs, files) in os.walk(folder): 
        for name in files: 
         line.write(name + '\n') 
     return file_name  

    def dict_factory(cursor, row): 
     d = {} 
     for idx, col in enumerate(cursor.description): 
      d[col[0]] = row[idx] 
     return d 

    def open_sql(sql_folder, sql_name, sql_table): 
     # databases are located at /work/jmjohnso1/db_project 
     path_name = os.path.join(sql_folder,sql_name).strip() 
     con = lite.connect(path_name) 
     con.row_factory = dict_factory 
     cur = con.cursor() 
     cur.execute('SELECT * FROM ' + sql_table) 

     dict_contents = defaultdict(list) 
     while cur.fetchone() != None: 
      cur.fetchone() 
      for k, v in cur.fetchone(): 
       dict_contents[k].append(v) 
     con.close() 
     pprint(dict_contents) 
     return dict_contents 

    def insert_tsk_mongo(sql_folder, sql_name, sql_table): 
     client = MongoClient() # connect to mongodb 
     db = client.nus # make or use a db called nus 
     contents = open_sql(sql_folder, sql_name, sql_table) 
     collection = sql_name.strip().replace('-','_') # because mongo will write but not read a collection with - 

     # document_id = db[collection].insert({ # sql_name is the hard drive name 
      # sql_table: 
       # contents   
     # }) 


    ############################################################################### 

    sql_folder = '/work/jmjohnso1/db_project'  
    # sql_tables = ['tsk_fs_info', 'tsk_image_info', 
        # 'tsk_db_info ', 'tsk_image_names', 
        # 'tsk_file_layout', 'tsk_objects', 
        # 'tsk_files', 'tsk_vs_info', 'tsk_vs_parts'] 

    sql_tables = ['tsk_files']    

    sql_folder_name = list_sql_db(sql_folder) 

    with open (sql_folder_name, 'r') as read: 
     sql_names = read.readlines() 

    for sql_name in sql_names: 
     for sql_table in sql_tables: 
      insert_tsk_mongo(sql_folder, sql_name, sql_table) 
     break  
+0

あなたは*これは間違っていると思いますか?あなたがそれを実行するとどうなりますか?あなたはあなたのコードが何をしているのか、あなたが望む出力を示すはずです。あなたはメインルーチンを提供していないので、私たちはあなたのためにこれをチェックすることはできません。 – Prune

+0

間違った言葉私は間違いがあるので、私は間違いを知っています。私はそれがうまくいかない理由を指摘していると思う。私はあまりにもたくさんの意見を書いていたので、そこにすべてを入れなかったのです...そうですか? for cur.fetchone(): ValueError:アンパックする値が多すぎる(期待値2) – JMJ

+0

ああ、人気のあるAnErrorです。 – kindall

答えて

2

この1とあなたのコード内のカーソルフェッチ命令を交換してみてください。

for k, v in cur.fetchone().items(): 

それへの参照を取得するときに限り、あなたのdict_factoryは辞書を返すように、あなたはそれに含まれるを反復処理する必要がありますアイテムを参照することはできません。それがタプルだったとき、cur.fetchone()は単純かつ正しく仕事をしていました。

関連する問題