每秒运行Python脚本读取新生成的.txt文件信息。

3 投票
2 回答
1937 浏览
提问于 2025-04-16 16:40

我的情况:我有一个固定的地方(目录/路径),每秒钟会生成一个.txt文件。我只需要复制这个文件的内容(内容的格式可以直接用来放入MySQL查询中),然后在我的Python脚本里把它放进MySQL查询里。我需要不停地这样做,也就是说,不能停,一直持续下去。

我的脚本大概是这样的:

import MySQLdb

mydb = MySQLdb.connect(host="IP_add", user="uname", passwd="pass", db="DB_name")
cursor = mydb.cursor()

#Need to add things below-

    sql = """INSERT INTO table_name VALUES('%d', 'dummy%d')""" % (i, i) //add what here ?

    cursor.execute(sql)
    mydb.commit()


mydb.close()

问题:我不知道怎么写一个这样的脚本,让它一直运行,并且只打开一次MySQL连接,同时不断扫描我已知的文件夹/目录/路径,寻找新的文本文件,持续读取里面的信息,并把这些信息放入MySQL的INSERT查询中。[好的一点是,我不需要格式化文本文件的内容,只需要读取它里面的内容就可以了。]

请帮帮我!

祝好,
Chirayu

2 个回答

2

你还可以使用MySQL的命令 Load data infile

这个方法比逐条插入数据要快得多,而且你不需要任何perl代码来读取这些行。

示例

sql = """LOAD DATA INFILE '/var/test/test1.txt' INTO TABLE table1"""
cursor.execute(sql)

Load data infile有很多选项可以设置字段和行的分隔符,具体可以查看这里:
http://dev.mysql.com/doc/refman/5.1/en/load-data.html

要加载一个包含

6666, 'test'

使用

LOAD DATA INFILE 'c:/test.txt' INTO TABLE `test` 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\'' 
LINES TERMINATED BY '\r\n';

注意在文件路径中使用正斜杠 (即使在Windows上也是),以及用 '\' 来在两个引号之间放一个单引号 '。行结束符在Windows上是正确的,Linux上需要用 LINES TERMINATED BY '\n'

如果你真的很懒
可以创建一个MySQL事件。

DELIMITER $$

CREATE EVENT import_file       
ON SCHEDULE
EVERY 1 MINUTE                 
DO BEGIN
  LOAD DATA INFILE 'c:/test.txt' INTO TABLE `test` IGNORE 
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\'' 
    LINES TERMINATED BY '\r\n';
END$$

DELIMITER ;

IGNORE 这个关键词会跳过那些会引发主键或唯一键冲突的字段,这样就不会尝试导入那些条目了。
要定义合适的字段为唯一,以防止MySQL导入重复的条目。

想了解更多关于事件的信息
请查看:http://dev.mysql.com/doc/refman/5.1/en/create-event.html

4
import MySQLdb
import os
import time
from stat import ST_MTIME

TIME_TO_SLEEP = 1          # to avoid CPU burning

mydb = MySQLdb.connect(host="IP_add", user="uname", passwd="pass", db="DB_name")
cursor = mydb.cursor()
last_date = 0
while True:                        # or what you want as stop condition
    time.sleep(TIME_TO_SLEEP)
    stat = os.stat(filename)
    if stat[ST_MTIME] > last_date: # check the last modification date
        last_date = stat[ST_MTIME] # if more recent, store the last date
        with open(filename) as f:   # open the file
            sql = f.read()         # put the content in the sql data base
            if sql:
                cursor.execute(sql)
                mydb.commit()

mydb.close()

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言进行解释。

撰写回答