每秒运行Python脚本读取新生成的.txt文件信息。
我的情况:我有一个固定的地方(目录/路径),每秒钟会生成一个.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 个回答
你还可以使用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
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()
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言进行解释。