2016-04-12 19 views
0

まず、コマンドライン引数としてディレクトリ名をとり、関連するディレクトリサブツリー内のすべてのファイルを検出するスクリプトを作成する方法を理解しようとしています。この情報は、Sqlite3データベース内の3つのフィールド(ファイル拡張子(.cpp、.docなど)を表す(ext、path、fname)、ディレクトリの完全パス名のみ)、ファイルの名前(例えば、foo.cpp)などが含まれます。Pythonのコマンドライン引数とSQlite3へのアクセス

SQLiteデータベースファイルの名前は、2番目のコマンドライン引数()にする必要があります。

これは、サンプルコマンドラインです:ここで

python readfiles.py Stuff filesdb 

は、ファイル内のエントリのいくつかのサンプルです:

(u'ppt', u'Stuff/ACCU', u'ACCU-Templates.ppt') 
(u'cpp', u'Stuff/ACCU/code/C01', u'Auto_ptr.cpp') 
(u'cpp', u'Stuff/ACCU/code/C01', u'Autoexcp.cpp') 
(u'cpp', u'Stuff/ACCU/code/C01', u'BadException.cpp') 
(u'cpp', u'Stuff/ACCU/code/C01', u'Basexcpt.cpp') 
(u'cpp', u'Stuff/ACCU/code/C01', u'Cleanup.cpp') 

私は最初の場所でデータベースにアクセスするに精通していないですし、これができる最善の方法についていくつかの提案が必要です。

答えて

0

コマンドライン引数を取得するには、sys.argvリストを使用できます。あなたの例のコマンド呼び出しの場合:rootでの結果は'filesdb''Stuff'db_nameセットに設定されていることを実行

import sys 

root = sys.argv[1] 
db_name = sys.argv[2] 

他の部分はos.walk()を使用して解決でき、ファイルシステムをスキャンできます。

import os 
import os.path 
import sqlite3 

with sqlite3.connect(db_name) as db: 
    cursor = db.cursor() 
    cursor.execute('create table if not exists files (ext text, path text, fname text)') 

    for dirpath, dirnames, filenames in os.walk(root): 
     for filename in filenames: 
      ext = os.path.splitext(filename)[-1].replace('.', '') 
      cursor.execute('insert into files (ext, path, fname) values (?, ?, ?)', (ext, dirpath, filename)) 

ファイルごとのクエリの代わりにcursor.executemany()を使用すると、パフォーマンスが向上する可能性があります。これを行うには、(ext, dirpath, filename)を含むタプルのリストを作成し、それをexecutemany()に渡します。

関連する問題