Estou tentando configurar um sistema em que, sempre que um novo arquivo for criado em uma pasta, ele lerá automaticamente o conteúdo e o inserirá em um banco de dados. Esses arquivos serão principalmente arquivos .txt, mas talvez eu precise convertê-los em arquivos .csv.
Atualmente estou usando o watchdog que funciona muito bem. Ele "vigia" uma pasta específica e cria um evento toda vez que um arquivo (/ pasta) é criado, editado ou removido. Minha pergunta é qual é a melhor / mais eficiente maneira de lidar com esse evento?
Os arquivos serão adicionados todos os dias em um determinado horário (todos os dias no mesmo horário) e podem variar de 100 a 1.000 arquivos diferentes por dia. Todos os arquivos são adicionados à pasta em alguns minutos.
Meu código, usando Psycopg :
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()
Como você pode ver agora, o script se conecta ao banco de dados e importa test.txt
(um local estático), então ele também assiste a uma pasta e imprime o que quer que aconteça. Esses dois eventos ainda estão desconectados. Assim, minha pergunta, mais especificamente, devo chamar main()
toda vez que um novo on_create
é acionado (portanto, uma nova conexão a cada vez)? Ou crie uma conexão com o banco de dados e observe a pasta (mantendo uma conexão aberta por toda parte) e, em seguida, chamando cursos.execute
sempre que um novo on_create
for acionado.
Qual seria a maneira mais eficiente?
(É claro que filepath/test.txt
será alterado para o caminho dos arquivos encontrados)
Banco de dados: PostgreSQL. Python versão 2.7.