2011-04-29 28 views
3

我的情况:我有一个已知位置(目录/路径).txt文件将被生成的每1秒,我只需要复制其内容(内容是可以直接用来放在一个MySQL查询的格式),并把它放在我的Python脚本MySQL查询。我需要保持这样持续的,即马不停蹄&始终。运行Python脚本来读取信息。从一个新的.txt文件在已知位置生成每1秒

的脚本是这样的:

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已

+0

什么创建文件?如果这是* nix中,你可以创建一个管道文件,只是读出一个结束,而不管写入的数据写入到它 – tMC 2011-04-29 16:00:20

+0

@ TMC,以及正在在基于Linux的机器生成的数据,你可以给一个链接,这个管道文件你在说什么? – Chirayu 2011-04-29 16:09:05

+0

'man mkfifo'要小心,当一个进程打开文件进行写入时,它会阻塞,直到另一个进程打开它进行读取。 – tMC 2011-04-29 16:13:10

回答

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() 
+0

@Cedric,谢谢,很多关于replying..your代码似乎是正确的,但我有2个问题 - ** 1)**如果我要寻找在特定位置的任何新文件,然后做你给的东西(即根据你的代码寻找最新的'文件名'),怎么做? ** 2)**如何在 - os.stat(filename)中指定文件名的路径? 很抱歉,如果我的问题遇到天真,但我几乎没有任何的Python经验,需要这让我的项目。 – Chirayu 2011-04-29 15:40:01

+0

@Cédric:做得很好;您可能需要在循环中添加time.sleep(1)以避免挂住CPU。 – mjv 2011-04-29 15:43:17

+0

@Cedric及其他人,我在 - 打开(“query.txt”)为f:时得到一个错误,它强调单词打开并在语法中说错误:无效语法......帮助! – Chirayu 2011-04-29 16:16:51

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

+0

@Johan,我想知道你的方法只有一个常量文本文件在已知的位置,得到一个错误,认为你可以很容易地解决它.. 我的文本文件只包含 - 6666,'kool',我得到一个错误说错误的mysql语法附近table1 ...帮助! – Chirayu 2011-04-29 16:14:04

+0

@Chirayu,忘记了'TABLE'关键词,修复了答案。 – Johan 2011-04-29 17:17:41

+0

@Johan,感谢edit..my文件包含的数据如你所述,这个文件存储在python脚本所在的同一个文件夹中,这是一个linux机器。与MySQL的连接是远程的,也就是说, MySQL存储在远程Windows机器上。这里是我的脚本 'import MySQLdb import os mydb = MySQLdb.connect(host =“11.40.3.167”,user =“anad”,passwd =“anad”,分贝= “trial1”) 光标= mydb.cursor() SQL = “” “LOAD DATA INFILE '的test.txt' INTO TABLE'intrial1'” “” cursor.execute(SQL) mydb.commit() mydb.close() ' 我得到一个呃ror,这是在下一个评论。 – Chirayu 2011-04-29 17:47:52

相关问题