2016-12-07 3 views
0

erstellt writed I-App, die Bestelldaten von Prestashop Datenbank zu erhalten, setzen Sie sie in XML-Datei importieren, dann UPS WorldShip (Software für das Senden von UPS Pakete), die XML-Datei und erstellen eigene out-Datei mit Ergebnis als Trackingnummer. Im nächsten Schritt analysiere ich diese Exit-Datei, um die Tracking-Nummer zu erhalten und sie in meiner lokalen Datenbank zu speichern.die Datei lesen, wenn es in Python

Mein Problem ist, wie gerade erstellt (.out) erhält nur dann Datei, wenn es fertig ist (erstellt). In diesem Moment habe ich Code wie folgt:

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") 

Und das ist schlechte Lösung. Ich möchte "warten bis die Datei erstellt wird".

Ich weiß in Python ist Fonction isfile() welche Kontrolle Datei existiert, aber ich weiß nicht, wie man überprüft, bis es in der Tat wird es sein.

+0

See [ 'Watchdog'] (https://pypi.python.org/pypi/watchdog) für plattformübergreifende, ereignisbasierte Überwachung von Systemereignissen. Oder verwenden Sie einfach eine altmodische Abfrage in einer expliziten Schleife. –

Antwort

3

Die einfachste Lösung ist abzufragen. Ich zeichne hier Inspiration aus WebDriverWait Klasse Selen.

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) 

Um die obige Klasse zu verwenden, es ist einfach zu initialisieren und eine aufrufbare seiner until() Methode übergeben.

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

Danke, das ist das, was ich suchte – user3041764

0

Eine mögliche Lösung könnte die Liste der Dateien in Ihrem Ausgabeverzeichnis sein halten Überprüfung: wenn die Liste ändert es bedeutet, dass Sie neue Dateien hinzugefügt, die Sie bearbeiten können.

Pseudo-Code:

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