私は、新しいファイルがフォルダ内に作成されるときはいつでも、それが自動的に内容を読んでそれをデータベースにプッシュするようにシステムを設定しようとしています。これらのファイルは主に.txtファイルですが、私はそれらを.csvファイルに変換する必要があるかもしれません。
現在使用しています 番犬 これはとてもうまくいきます。特定のフォルダを「監視」し、ファイル(/フォルダ)が作成、編集、または削除されるたびにイベントを作成します。私の質問は、このイベントを処理するための最善/最も効率的な方法は何ですか?
ファイルは毎日特定の時間に(毎日同じ時間に)追加され、1日に100から1000の異なるファイルの範囲になります。 すべて ファイルが数分以内にフォルダに追加されます。
マイコード、 サイコプグ :
import sys
import time
import logging
import psycopg2
import pprint
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler
def main():
conn_string = "host='localhost' dbname='dbname' user='user' password='password'"
print "Connecting to database\n ->%s" % (conn_string)
conn = psycopg2.connect(conn_string)
cursor = conn.cursor()
cursor.execute("COPY trades FROM 'filepath/test.txt' DELIMITERS ',' CSV;")
records = cursor.fetchall()
pprint.pprint(records)
if __name__ == "__main__":
main()
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
path = sys.argv[1] if len(sys.argv) > 1 else '.'
event_handler = LoggingEventHandler()
observer = Observer()
observer.schedule(event_handler, path, recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
ご覧のとおり、スクリプトはデータベースに接続してインポートします。 test.txt
(静的な場所)それから、それはまたフォルダを見て、何が起こっても印刷します。これら2つのイベントはまだ接続されていません。したがって、私の質問、より具体的には、私は呼び出すべきです main()
毎回新しい on_create
トリガされます(したがって、毎回新しい接続)?または、データベースへの接続を作成してからフォルダを監視し(つまり、開いている接続を維持しながら)、呼び出します cursos.execute
毎回新しい on_create
トリガーされます。
最も効率的な方法は何でしょうか。
(もちろん filepath/test.txt
見つかったファイルのパスに変更されます)
データベース:PostgreSQL。 Pythonバージョン2.7