2013-07-09 147 views
1

我最近開始學習Python,我有一個應用程序,我想創建一個文本文件,每兩秒鐘記錄一次數據,然後重新開始一個新文件。我已經寫好了將打開的文件格式化爲SQL並且正在添加SQL INSERT查詢的地方。運行Python函數每秒鐘一分鐘

我遇到的麻煩是創建代碼實際正常工作。 Python的本身是工作的罰款只是插入SQL到已經打開的文件的新線,但輸出看起來是這樣的:

[blank line is here because of the \n] 
INSERT INTO table (column 1, column 2) VALUES ('7113', '1337'); 
INSERT INTO table (column 1, column 2) VALUES ('7113', '1337'); 

我的問題是,我需要得到的數據,所以沒有新線在最上面沒有分號,最後一行沒有分號。

這是我的源:

from threading import Timer 
import time 

def start(): 
    t = Timer(1.0,start) 

    foo = "7113" 
    bar = "1337" 
    date = time.strftime('%Y-%m-%d %H:%M:%S') 
    sql = "\nINSERT INTO table (column 1, column 2) VALUES ('%s', '%s');" % (foo, bar) 

    query = open(date + ".sql", "a") 
    query.write(sql) 
    query.close() 
    t.start() 

start() 

由於我不是最好的語言用的是我想做一個簡單的版本是:

  1. 有一個功能運行第一個代碼,吐出INSERT INTO table (column 1, column 2) VALUES ('7113', '1337');前面沒有額外的行,但用分號。
  2. 有另外一個函數運行58次,在SQL查詢之前加上\n行,之後加上分號。
  3. 是否有最後一個函數運行第60次,包括\n但沒有分號。
  4. 關閉當前文件並生成一個新的帶有時間戳的文本文件,例如2013-07-09 12-30-00.sql,然後重複2013-07-09 12-31-00.sql等操作。

我想在此之後還有很多事情,比如讓PHP或Python腳本讀取日期並執行它,或者我可以讓它們全部執行,然後按升序排列表。但是,這可以在以後解決和研究。我只是想讓這個工作,因爲我一直在尋找幾個小時,如何做到這一點,我找不到任何有用的東西。不過,我相信答案是顯而易見的。

感謝您的閱讀,我希望你們能幫忙!我已經使用這個網站了一些有用的花絮,這是太棒了。無論誰提出這個需要讚美一堆。此外,如果任何人有任何有用的學習Python資源(我通過Codecademy瞭解到),我會非常感激他們。這比學習C++更有趣。

+0

爲什麼在第一行和最後一行需要不同的行爲?爲什麼不直接用分號和換行符結束每一行? – user2357112

+0

我以爲你不能在MySQL中這樣做。 – Jake

回答

0

我通過使用global counting變量並使用ifelif語句解決了該問題。目前該腳本每500毫秒運行一次,沒有任何問題。如果任何人希望看到我的代碼,這就是:

Commented version because syntax highlighting here with comments is screwing up for whatever reason.

from threading import Timer 
import xml.etree.ElementTree as ET 
import urllib 
import time 

datetime = time.strftime('%Y-%m-%d %H.%M') 
filename = datetime + ".sql" 
url = "localhost/send.cgi" 
interval = 0.5 
table_name = "0001" 
columns = "(time, foo, bar)" 
counting = 0 

def parser(): 
    t = Timer(interval, parser) 
    global counting 
    global filename 
    query = open(filename, "a") 

    if counting == 0: 
     date = int(time.time()*1000) 
     web = urllib.urlopen(url) 
     tree = ET.parse(web) 
     root = tree.getroot() 
     foo = root[1].text.replace(" ", "") 
     bar = root[2].text.replace(" ", "") 
     sql = "INSERT INTO %s %s VALUES ('%s', '%s', '%s');" % (table_name, columns, date, foo, bar) 
     counting += 1 
     query.write(sql) 
     print counting 
     t.start() 
    elif (counting > 0) and (counting < 59): 
     date = int(time.time()*1000) 
     web = urllib.urlopen(url) 
     tree = ET.parse(web) 
     root = tree.getroot() 
     foo = root[1].text.replace(" ", "") 
     bar = root[2].text.replace(" ", "") 
     sql = "\nINSERT INTO %s %s VALUES ('%s', '%s', '%s');" % (table_name, columns, date, foo, bar) 
     counting += 1 
     query.write(sql) 
     print counting 
     t.start() 
    elif counting == 59: 
     date = int(time.time()*1000) 
     web = urllib.urlopen(url) 
     tree = ET.parse(web) 
     root = tree.getroot() 
     foo = root[1].text.replace(" ", "") 
     bar = root[2].text.replace(" ", "") 
     sql = "\nINSERT INTO %s %s VALUES ('%s', '%s', '%s')" % (table_name, columns, date, foo, bar) 
     counting += 1 
     query.write(sql) 
     print counting 
     t.start() 
    elif counting == 60: 
     query.close() 
     datetime = time.strftime('%Y-%m-%d %H-%M') 
     filename = datetime + ".sql" 
     counting = 0 
     t.start() 
parser() 

如果有任何可以改進,我希望能看到他們! < 3該代碼僅適用於某種類型的Web服務器。它可能需要一些修改才能工作。 Web服務器根據請求發送一個虛擬的XML文件(這只是數據,而不是文件),並且這個代碼請求它,解釋它並將它發送到一個.sql文件中,以便我稍後可以將它們執行到一個表到某物。最後,代碼將抓取十個不同的數據列,並創建一個小時的文件,即7200個半秒。

享受!

編輯:耶,顯然SQL語法不起作用。故障排除。