2016-04-12 20 views
0

Ich versuche zu verstehen, wie man ein Skript schreibt, das zuerst einen Verzeichnisnamen als Befehlszeilenargument nimmt und dann alle Dateien im zugehörigen Unterverzeichnis entdeckt. Es speichert die Informationen in einer Sqlite3-Datenbank in einer Tabelle namens files, die 3 Felder enthalten: (ext, Pfad, fname), die die Dateierweiterung (.cpp, .doc usw.) darstellen, den vollständigen Pfadnamen des Verzeichnisses (nur) die Datei befindet sich in und den Namen der Datei (z. B. foo.cpp).Python Befehlszeilenargument und SQlite3-Zugriff

Der Name der SQLite-Datenbankdatei sollte das zweite Befehlszeilenargument() sein.

Dies ist eine Beispielbefehlszeile:

python readfiles.py Stuff filesdb 

Hier ist ein Beispiel von einigen der Einträge in den Dateien:

(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') 

Ich bin nicht sehr vertraut mit Datenbanken in erster Linie den Zugriff auf und Ich brauche nur einige Vorschläge, wie das am besten gemacht werden kann.

Antwort

0

Um die Befehlszeilenargumente zu erhalten, können Sie die sys.argv Liste verwenden. Für Ihr Beispiel Befehlsaufruf:

import sys 

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

ausführen, die Ergebnisse in root zu 'Stuff' und db_name Satz 'filesdb' gesetzt werden.

Der andere Teil Ihrer Frage kann mit os.walk() gelöst werden, um das Dateisystem zu durchlaufen.

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)) 

Eine potenzielle Leistungssteigerung kann durch die Verwendung cursor.executemany() anstelle einer Abfrage pro Datei gewonnen werden. Um dies zu tun, würden Sie eine Liste von Tupeln erstellen, die (ext, dirpath, filename) enthalten und diese an executemany() übergeben.

Verwandte Themen