# - * - コーディング:UTF-8 - * -
2019年10月16日:#は時間を作成します。
#更新時間:2019年11月28日
#バージョン:1.0
#バージョン:マルチスレッド/エラーモジュールで2.0増加は自動的に再実行
#インポートモジュール
輸入cx_Oracle
輸入OS
Pd等の輸入パンダ
SQLなどの輸入pandas.io.sql
インポート時
輸入openpyxl
XWとしてインポートxlwings
インポートのログ
輸入再
インポートのスレッド
#作業ディレクトリを取得
SQLPATH = os.getcwd()+ '\\' #取得現在のフォルダの内容を、正しい場合は、SQLPATH =の後ろに直接入力コードを使用して 'E:\\'
#ログを設定します。
logging.basicConfig(フォーマット= '%(いるasctime)S - %(パス名)S] - %(levelname)S:%(メッセージ)をS'、レベル= logging.INFO、ファイル名= SQLPATH + 'log.txtという')
#(ファイルに名前を付けるための)システムの日付を取得します。
時間_ = time.time()
日付= time.strftime( "%Yの%のM%のD")
#変数を定義
名前= '日々のビジネスの名前テンプレート#
印刷( 'ランニング開始:%s' は%名)
#SQLコードのファイル名
SQL1 = SQLPATH + 'hangxian_ri.sql'
SQL2 = SQLPATH + 'hangxian_zhou.sql'
SQL3 = SQLPATH + 'hangxian_yue.sql'
#空のデータフレームを定義します(機能を使用するには、あなたが最初に定義する必要があります)
結果1 = pd.DataFrame()
結果2 = pd.DataFrame()
result3 = pd.DataFrame()
#DEFINEは、SQLの読み取り機能を実行することができます
デフread_run_write1(sql_name):
グローバル結果1#はグローバル変数の結果1を呼び出し、グローバル変数の使用は、グローバルに変更することができます
印刷( 'コードを実行する:%s' は%のsql_name)
オープン(sql_name = 'UTF-8-SIG' をコードする、モード= 'R')Fとして有する:#オラクルコードを読み取る、中国のエンコーディングUTF-8-SIG、
sql_list = f.read()
sql_list = re.sub(R ' - *'、 ''、sql_list)#コメント除去
接続= cx_Oracle.connect( 'ユーザ名/パスワード@IPアドレス/名前のデータベース')
空間へ#ラインフィード、セミコロンを除去するステップと、コード= sql_list.replace( '\ n' は、 '').replace( ''、 '')
私は範囲内(5)のために:自動的に10秒再実行する場合#実行Oracleコードは失敗します
試してみてください。
パケットPDの実行コードを使用して結果1 = sql.read_sql(コード接続)#read_sql機能、結果の型のデータフレームを返します
成功した場合にループの外に実行するように#のコードを破ります
除きます:
プリント(%(sql_name、(I + 1)) '%sの動作エラーコードは、%dの上で再実行されます')
time.sleep(10)#コードは再実行する前に、10秒を失敗しました
( '完全なコードを実行した:%s' は%sql_name)を印刷
デフread_run_write2(sql_name):
グローバル結果2
印刷( 'コードを実行する:%s' は%のsql_name)
Fとしてオープン(sql_name = 'UTF-8-SIG' をコードする、モード= 'R')を有します。
sql_list = f.read()
sql_list = re.sub(R ' - *'、 ''、sql_list)#コメント除去
接続= cx_Oracle.connect( 'ユーザ名/パスワード@IPアドレス/名前のデータベース')
空間へ#ラインフィード、セミコロンを除去するステップと、コード= sql_list.replace( '\ n' は、 '').replace( ''、 '')
範囲内のiについて(5):
試してみてください。
結果2 = sql.read_sql(コード、接続)
ブレーク
除きます:
プリント(%(sql_name、(I + 1)) '%sの動作エラーコードは、%dの上で再実行されます')
time.sleep(10)
( '完全なコードを実行した:%s' は%sql_name)を印刷
デフread_run_write3(sql_name):
グローバルresult3
印刷( 'コードを実行する:%s' は%のsql_name)
Fとしてオープン(sql_name = 'UTF-8-SIG' をコードする、モード= 'R')を有します。
sql_list = f.read()
sql_list = re.sub(R ' - *'、 ''、sql_list)#コメント除去
接続= cx_Oracle.connect( 'ユーザ名/パスワード@IPアドレス/名前のデータベース')
空間へ#ラインフィード、セミコロンを除去するステップと、コード= sql_list.replace( '\ n' は、 '').replace( ''、 '')
範囲内のiについて(5):
試してみてください。
result3 = sql.read_sql(コード、接続)
ブレーク
除きます:
プリント(%(sql_name、(I + 1)) '%sの動作エラーコードは、%dの上で再実行されます')
time.sleep(10)
( '完全なコードを実行した:%s' は%sql_name)を印刷
実行するために、複数のスレッドのための#SQLコード
__name__ == '__main__' の場合:
T1 = threading.Thread(目標= read_run_write1、引数=(SQL1))#関数を呼び出し、パラメータを渡すSQL1、メモ場合にのみつのパラメータ、カンマの後ろにパラメータ必要があること
T2 = threading.Thread(目標= read_run_write2、引数=(SQL2))
T3 = threading.Thread(目標= read_run_write3、引数=(SQL3、))
t1.start()#実行を開始します
t2.start()
t3.start()
t1.join()#はせずに、スレッドを追加された参加()終了操作がメインスレッドが他のスレッドが完了するまで実行するのを待たずに、次のコードを実行し、自動的にポップアップで
t2.join()
t3.join()
#書き込みデータ
印刷(「データが書き込まれています」)
アプリ= xw.App(可視= Falseを、add_book =偽)#可視= FalseのExcelプログラムバックグラウンドで開い
WB = app.books.open(SQLPATH +名+「のxlsx」)#与えられた式はタイトルだけと空のテンプレートを保持して開きます
wb.sheets [ '毎日'] .range( 'A4')オプション(= 'テーブル' を展開)値=結果1 .. [:]。値#結果[:]値が書き込まれたインデックスを除去してもよいし、タイトル、結果1。セルA4から始まる、「毎日」テーブルに書き込まれます
wb.sheets [ 'スクロール1週間'] .range( 'A4')オプション(= 'テーブル' を展開する)値=結果2 .. [:]。値
wb.sheets [ '月累计'] .range( 'A4')オプション(= 'テーブル' を展開)値= result3。[:]値
ファイル名= SQLPATH +名+日付+ 'XLSX' #新しく生成された名前エクセル
テンプレートを変更せずにwb.save(ファイル名)新しいExcelなど#保存し、
近いwb.close()#ワークブック
印刷(ファイル名+「自動的に生成されました」)
TIME_END = time.time()
印刷( "実行時間:%2fとの" %(TIME_END-時間_))
logging.info( "時間を実行します。2F%s" は%(TIME_END-時間_))#レコードプログラムの実行時に操作ログ、log.txtという
困難のいくつかのPythonの自動化
マルチスレッドが同時に機能が完了した場合、直接実行するために直接書き込む、書き込み操作をExcel、および実行されている複数のスレッドを使用することはできません、競合がCOMモジュールを文句を言うだろう
結果変数の世代の直接の関数であることができない問題を解決するために、我々は、空のデータフレームを定義する必要があり、変数を生成する機能を(おそらく、その他のより良い方法)完全な作用効果を達成するために、グローバル関数は、呼び出しにグローバル変数として宣言しました