2016-12-07 10 views
0

prestashopデータベースから注文の詳細を取得してXMLファイルに保存し、UPS WorldShip(UPSパーセルを送信するソフトウェア)をインポートしてXMLファイルをインポートし、結果ファイルを作成する追跡番号として。次のステップでは、その出口ファイルを解析して追跡番号を取得し、ローカルデータベースに保存します。ファイルをPythonで作成したときに読む

私の問題は、準備ができた(作成された)ときだけ作成した(.out)ファイルを取得する方法です。現時点では、私はこのようなコードを持っています:

tree.write("C:/ProgramData/UPS/WSTD/IMPEXP/XML Auto Import/" + today + "-" + order_id + ".xml", encoding="utf-8", xml_declaration=True) 
time.sleep(1) 
out_file = etree.parse("C:/ProgramData/UPS/WSTD/IMPEXP/XML Auto Import/" + today + "-" + order_id + ".out") 

これは解決策ではありません。私は "ファイルが作成されるまで待つ"と思います。

私はパイソンで知っているのはisfile()ですが、ファイルがあるかどうかチェックしていますが、実際に確認する方法はわかりません。

+0

プラットフォーム間、イベントベースのシステムイベントの監視については、['watchdog'](https://pypi.python.org/pypi/watchdog)を参照してください。または、明示的なループで昔ながらのポーリングを使用するだけです。 –

答えて

3

最も簡単な解決策をポーリングすることです。ここでは、セレンのWebDriverWaitクラスからインスピレーションを引き出します。

from time import time, sleep 

class Waiter(object): 
    def __init__(self, poll=0.5, timeout=60): 
     self.poll = poll 
     self.timeout = timeout 

    def until(self, callable, message='Timed out'): 
     end_time = time() + self.timeout 

     while True: 
      value = callable() 
      if value: 
       break 

      sleep(self.poll) 

      if time() > end_time: 
       raise Exception(message) 

ちょうどそれを初期化し、そのuntil()メソッドへの呼び出し可能に合格し、上記のクラスを使用します。

import os 
wait = Waiter() 
wait.until(lambda: os.path.exists('fake.txt')) 
+0

ありがとう、これは私が探していたものです – user3041764

0

解決策は、出力ディレクトリのファイルの一覧を確認し続けることができます。リストが変更されると、処理できる新しいファイルが追加されたことを意味します。

擬似コード:

import os 

checked_files = [] 

while(1): 

    all_files = os.listdir(output_folder) 
    new_files = set(all_files) - set(checked_files) 

    for file in new_files: 
     # Process them 
     .... 

    checked_files = all_files 
関連する問題