我正在尝试建立一个系统,每当文件夹中创建新文件时,它都会自动读取内容并将其推送到数据库中。这些文件主要是 .txt 文件,但我可能需要将它们转换为 .csv 文件。
目前我正在使用看门狗效果很好。它“监视”特定文件夹,并在每次创建、编辑或删除文件(/文件夹)时创建一个事件。我的问题是处理此事件的最佳/最有效方法是什么?
文件将在每天的特定时间(每天同一时间)添加,每天可以添加 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
(静态位置),然后它还监视文件夹并打印发生的任何事情。这两个事件尚未连接。因此,我的问题更具体地说,main()
每次on_create
触发新事件时我是否应该调用(因此每次都有新的连接)?或者创建与数据库的连接,然后监视文件夹(从而始终保持打开的连接),然后cursos.execute
每次on_create
触发新事件时调用。
什么是最有效的方法?
(当然filepath/test.txt
会改为找到的文件的路径)
数据库:PostgreSQL。Python 版本 2.7。
答案1
我会保留连接。如果你想要更高级一点,你可以设置一个超时时间,如果 10 分钟内没有新文件进来,你就会关闭连接并在下次需要时重新创建它。
如果保持连接打开,则务必确保它不会使事务保持打开状态。它必须提交(或回滚)最后一项工作,以便事务处于该<IDLE>
状态。不这样做会导致数据库服务器性能问题和不必要的磁盘空间使用增加。
您可以通过检查 PostgreSQL 中的视图来验证事务是否空闲pg_stat_activity
。