1

私は最近 Python の学習を開始しました。2 秒ごとに 1 分間データを記録し、新しいファイルから再開するテキスト ファイルを作成するためのアプリケーションがあります。開いているファイルが SQL 用にフォーマットされており、SQL INSERT クエリが追加されている場所を書きました。

私が抱えている問題は、実際に正しく動作するコードを作成することです。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');1 つの関数で最初のコードを実行し、前に余分な行を付けずにセミコロンを付けて吐き出します。
  2. 別の関数を 58 回実行し\n、SQL クエリの前に を含む行を追加し、後にセミコロンを追加します。
  3. \nセミコロンを含め、最後の関数を 60 回実行します。
  4. 現在のファイルを閉じて、その分のタイムスタンプを含む新しいテキスト ファイルを生成し2013-07-09 12-30-00.sqlます2013-07-09 12-31-00.sql

その後、PHP または Python スクリプトを取得して日付を読み取って実行する、またはそれらすべてを実行してテーブルを昇順に並べ替えるなど、さらに多くのことがあると思います。ただし、それは後日解決して調査することができます。これを機能させる方法を数時間検索していて、役立つものが見つからなかったので、これを機能させたいだけです。しかし、答えは明らかだと確信しています。

読んでくれてありがとう。皆さんが助けてくれることを願っています! 私はこのウェブサイトを役立つちょっとした情報のためにたくさん使ってきましたが、それは素晴らしいものです. これを思いついた人は誰でも賞賛される必要があります。

また、Python を学習するのに役立つリソースがあれば (私はCodecademyで学習しました)、本当に感謝しています。これは、C++ を学ぶよりもはるかに楽しいものです。

4

1 に答える 1

0

global counting変数を持ち、 ifandelifステートメントを使用して問題を解決しました。現在、スクリプトは 500 ミリ秒ごとに問題なく機能しています。誰かが私のコードを見たい場合は、ここにあります:

ここでコメント付きの構文の強調表示が何らかの理由で台無しになっているため、コメント付きのバージョン。

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 ファイルに出力することです。何かにテーブル。最終的に、コードは 10 を超える異なる列のデータを取得し、1 時間 (7200 0.5 秒) のファイルを作成します。

楽しみ!

編集: どうやら SQL 構文が機能しないようです。トラブルシューティング。

于 2013-07-10T12:55:52.773 に答える