运行Python脚本读取信息。每1秒在已知位置生成一个新的.txt文件
我的场景:我有一个已知的位置(目录/路径),每1秒生成一个.txt文件,我只需要复制它的内容(内容的格式可以直接用于放入MySQL查询),然后将它放入Python脚本中的MySQL查询中。我需要持续不断地这样做,也就是说,不停地、始终地这样做 脚本类似于:运行Python脚本读取信息。每1秒在已知位置生成一个新的.txt文件,python,mysql,scripting,Python,Mysql,Scripting,我的场景:我有一个已知的位置(目录/路径),每1秒生成一个.txt文件,我只需要复制它的内容(内容的格式可以直接用于放入MySQL查询),然后将它放入Python脚本中的MySQL查询中。我需要持续不断地这样做,也就是说,不停地、始终地这样做 脚本类似于: import MySQLdb mydb = MySQLdb.connect(host="IP_add", user="uname", passwd="pass", db="DB_name") cursor = mydb.cursor()
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插入查询[一件好事是我不需要格式化文本文件的内容,只需要读取它包含的任何内容。]
请帮忙
问候,,
Chirayu也可以使用MySQL命令<代码>加载数据填充 这将比单个插入更快地完成您想要做的事情,而且您不需要任何perl代码来读取这些行 示例
sql = """LOAD DATA INFILE '/var/test/test1.txt' INTO TABLE table1"""
cursor.execute(sql)
加载数据填充有很多字段和行分隔符选项,请访问:加载包含以下内容的文件:
6666, 'test'
使用
请注意,在文件路径上(甚至在Windows上)使用正斜杠,并使用'\''
将一个引号放在两个引号内'
。行终止符对于Windows是正确的,Linux需要以“\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导入重复的条目
有关活动的更多信息
请参阅:@Cedric,非常感谢您的回复。您的代码似乎是正确的,但我有两个问题-1)如果我想在特定位置查找任何新文件,然后执行您提供的操作(即根据您的代码查找最新的“文件名”),如何执行?2) 如何在-os.stat(filename)中指定文件名的路径?很抱歉,如果我的问题被认为是幼稚的,但我几乎没有Python经验,需要这些来让我的项目工作起来。@Cédric:做得好;您可能希望在循环中添加一个time.sleep(1),以避免固定CPU。@Cedric&others,我在-处得到一个错误,将open(“query.txt”)作为f:,它在单词open下面加下划线,并在语法中显示erro:无效语法…帮助!如果您的python版本<2.5,with语句未知,请将其替换为:f=open(filename)
sql stuff。。。然后f.close()
@Cedric,成功了..非常感谢,我有一个问题,Qs。1) 对于我的第一条注释,根据您的代码,如果停止条件为while(true),现在当我运行此脚本时,它会继续运行,可能会查找文件名中的更改,但如果我在同一文件中进行任何更改,则脚本将停止并给出错误,如我在下一条注释中给出的错误(此注释中的字符限制):P!是什么创建了这个文件?如果这是*nix,您可以创建一个管道文件,并在写入数据时读取一端it@tMC,那么数据是在基于linux的机器上创建的,你能给你所说的这个管道文件提供一个链接吗?man mkfifo
当心,当进程打开文件进行写入时,它将被阻止,直到另一个进程打开它进行读取。@Johan,我在已知位置尝试了一个常量文本文件的方法,得到了一个错误,您可能会很容易解决它。。我的文本文件只包含-6666,'kool',我在表1附近说错误的mysql语法时出错了…帮助@Chirayu,忘记了表
关键字,修复了答案。@Johan,感谢您的编辑。.我的文件包含您所说的数据,该文件与python脚本存储在同一文件夹中,这是一台linux机器。.与MySQL的连接是远程的,即。,MySQL存储在远程windows计算机上。下面是我的脚本import MySQLdb import os mydb=MySQLdb.connect(host=“11.40.3.167”,user=“anad”,passwd=“anad”,db=“trial1”)cursor=mydb.cursor()sql=“”将数据填充'test.txt'加载到表中
intrial1”cursor.execute(sql)mydb.commit()mydb.close()
我收到一个错误,这是下一条评论。我得到了错误:\u mysql\u exceptions.InternalError:(29,“文件'C:\\Documents and Settings\\All Users\\Application Data\\mysql\\mysql Server 5.1\\Data\\trial1\\test.txt'not found(Errcode:2)”)
即使在Windows上也使用前向斜杠并指定完整路径,否则将使用相对于数据存储的路径。
LOAD DATA INFILE 'c:/test.txt' INTO TABLE `test`
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\''
LINES TERMINATED BY '\r\n';
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 ;