2016-07-15 16 views
-2

Ich habe ein Programm geschrieben, das eine CSV-Datei liest und den Inhalt als INSERT-Anweisungen ausgibt. Ich schrieb dann ein Ausführungsprogramm, das die Ausgabe des CSV-Parser-Programms nehmen und in eine TXT-Datei schreiben sollte, aber anstatt die gesamte Ausgabe zu schreiben, schreibt es nur die erste Anweisung. HierAusgabe von Python-Programm in TXT-Datei schreiben

ist der Code für den Vollstrecker:

import sys 

with open('insert.txt', 'wb') as f: 
    subprocess.check_call(["python", "CSVParserMultiple.py"], stdout=f) 

Und der Code für den Parser:

import csv, os 

path = 'C:/Users/user/Desktop/test/' 
for file in os.listdir(path): 
    if file.endswith('.csv'): 
# print ('Parsing file: ' + os.path.basename(path + file)) 
     openFile = open(path + file) 
     csvFile = csv.reader(openFile) 
     getHeader = next(csvFile) 
     columnHeaders = map((lambda x: "'" + x + "'"), getHeader[:-1]) 
     insert = 'INSERT INTO testing (' + "'ID', 'VehicleID', " + ', '.join(columnHeaders) + ') VALUES ' 
     for row in csvFile: 
      values = map((lambda x: "'" + x.strip() + "'"), row[:-1]) 
      print (insert + "(" + ", ".join(values) + ");") 
     openFile.close() 

ich nicht ganz sicher bin, dass es sinnvoll, sie als zwei separate Programme zu haben, macht aber ich konnte sie nicht dazu bringen, als definierte Funktionen in demselben Programm für das Leben von mir zu laufen. Wie kann ich das Ausführungsprogramm dazu bringen, alle Zeilen des Parser-Programms anstatt nur einer einzigen Zeile auszugeben? Und wie kann ich sie zu einem Programm kombinieren?

+0

Sie sollten diese Operationen in Funktionen einfügen. Wenn Sie Module wiederverwenden und sie aus anderen Skripts aufrufen möchten, müssen Sie sie installieren, indem Sie ein Python-Paket/Modul erstellen. –

+1

Aufruf einer Python-Datei über Subprozess ist ziemlich lächerlich. Tu das nicht. Wenn Sie * es * trennen müssen und eine andere Funktion nicht gut genug ist, erstellen Sie ein eigenes Modul (https://docs.python.org/3/tutorial/modules.html) –

+1

Nicht sicher Warum erscheint nur die erste Zeile in der Ausgabedatei? Um jedoch die beiden Skripte zu kombinieren, setzen Sie einfach die Anweisung 'with open' in das zweite Skript und verwenden Sie' f.write ('something \ n') 'anstelle von' print'. –

Antwort

0

Sie machen die Dinge komplizierter als sie sein müssen. Verschachteln Sie einfach Ihre offenen Anweisungen mit mit. Ein Programm. Und es druckt auf dem Bildschirm und schreibt in eine Datei.

import csv, os 

path = 'C:/Users/user/Desktop/test/' 
for file in os.listdir(path): 
    if file.endswith('.csv'): 
     # print ('Parsing file: ' + os.path.basename(path + file)) 
     with open(path + file) as infile: 
      with open(path+file+".txt",'w') as outfile: 
       csvFile = csv.reader(infile) 
       getHeader = next(csvFile) 
       columnHeaders = map((lambda x: "'" + x + "'"), getHeader[:-1]) 
       insert = 'INSERT INTO testing (' + "'ID', 'VehicleID', " + ', '.join(columnHeaders) + ') VALUES ' 
       for row in csvFile: 
        values = map((lambda x: "'" + x.strip() + "'"), row[:-1]) 
        print (insert + "(" + ", ".join(values) + ");") 
        outfile.write(insert + "(" + ", ".join(values) + ");" + "\n") 
+0

Zwei kleine Fehler, sonst genau das, was ich gesucht habe. Der erste ist, '' mit open (path + file + ".txt") als outfile zu ändern: 'to 'mit open (Pfad + Datei +" .txt "," w ") als outfile:' um Schreibrechte zu ermöglichen. Und die zweite ist, dass die korrekte Ausgabe in der Shell angezeigt wird, aber in der .txt-Datei wird nur die Kopfzeile mit keinen nachfolgenden Werten gedruckt. Ich bin mir nicht ganz sicher, wie ich das beheben soll, aber vielen Dank für die Hilfe. – ThoseKind

+0

Möglicherweise haben Sie ein Problem mit der Anweisung "," .join, wenn Ihre Werte numerisch und nicht als Zeichenfolge angegeben sind. Ich würde "Zeile" und "Werte" ausdrucken, um zu sehen, ob die Konvertierung wie erwartet verläuft. Und ich würde eine Testdatei verwenden, die nur 5 Datenzeilen enthielt. So gehen keine Fehlermeldungen durch Scrollen verloren. – WombatPM

+0

'print (row)' zeigt, dass jeder der Werte tatsächlich Zeichenfolgen ist (zB "11: 47"), obwohl sie Zahlen enthalten. 'print (values)' ergibt ''. Ich bin mir nicht sicher, was das bedeutet, aber wenn man bedenkt, dass die Anweisung '(insert +) (" + "," .join (values) +;); ") korrekt in der Shell ausgegeben wird, würde ich sowohl" row "als auch" values ​​"annehmen 'funktionieren ordnungsgemäß. Der Fehler müsste dann innerhalb von ".write" selbst liegen (sei es Syntax, obwohl ich sie genau aus der 'print'-Anweisung oder etwas anderem kopiert habe) oder in der' with'-Anweisung, die 'outFile' definiert. – ThoseKind

0

Nicht sicher, ob dies für Sie funktionieren würde, aber Sie können den Operator>/>> verwenden, um die Standardausgabe in eine Datei umzuleiten.

Edit: Der Unterschied zwischen> und >> ist, dass >> zum Ende der Datei anhängt, während> die Datei kürzt

$python program.py >> output.txt 

die Programme kombinieren Sie die Testamentsvollstrecker Programm haben könnte definiert werden, als Hauptfunktion, indem es als

def main(): 
    <executor code here> 
if __name__ == "__main__": 
    main() 

Dann definieren Sie stdout in eine Datei mithilfe von

umleiten

ähnliche Frage: Redirect stdout to a file in Python?

Verwandte Themen