Запуск скрипта Python для чтения информации.из нового файла .txt, генерируемого в известном месте каждые 1 сек. - PullRequest
3 голосов
/ 29 апреля 2011

Мой сценарий: У меня есть известное местоположение (каталог / путь), где файл .txt будет создаваться каждую 1 секунду, мне просто нужно скопировать его содержимое (содержимое в формате, который может быть использован непосредственно, чтобы вставить запрос MySQL) и поместить его в запрос MySQL в моем скрипте Python. Мне нужно продолжать делать это постоянно, то есть без остановки и всегда.

Сценарий выглядит примерно так:

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 было открыто только один раз, в то время как происходит постоянное сканирование моей известной папки / directory / путь для поиска нового текстового файла и просто продолжить чтение информации. он содержит и вставляет его в запрос MySQL INSERT. [Хорошо, что мне не нужно форматировать содержимое текстового файла, просто нужно прочитать все, что в нем содержится.]

Пожалуйста, помогите!

С уважением, Chirayu

Ответы [ 2 ]

4 голосов
/ 29 апреля 2011
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()
2 голосов
/ 29 апреля 2011

Вы также можете использовать команду MySQL. Load data infile.

Это будет делать то, что вам нужно, намного быстрее, чем отдельные вставки, плюс вам не понадобится никакой Perl-код для чтения строк.

Пример

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

Загрузка данных 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

...