2016-03-27 6 views
2

Ich bin ein paar Daten von Mongo, bereinigen es über Python, und schreibe es in Textdatei, um nach Vertica zu importieren. Vertica kann das Python-geschriebene gzip nicht analysieren (keine Ahnung warum), also versuche ich, die Daten in einen CSV zu schreiben und benutze stattdessen bash, um die Datei zu entpacken.Python Subprozess kann nicht die Ausgabe von csv Writer finden

csv_filename = '/home/deploy/tablecopy/{0}.csv'.format(vertica_table) 

with open(csv_filename, 'wb') as csv_file: 
    csv_writer = csv.writer(csv_file, delimiter=',') 

    for replacement in mongo_object.find(): 
     replacement_id = clean_value(replacement, "_id") 
     csv_writer.writerow([replacement_id, booking_id, style, added_ts]) 

subprocess.call(['gzip', 'file', csv_filename]) 

Wenn ich diesen Code ausführen, erhalte ich „gzip: file: Keine solche Datei oder das Verzeichnis“, trotz der Tatsache, dass 1) die Datei unmittelbar vorher erstellt wird immer und 2) gibt es bereits eine Kopie der csv im Verzeichnis vor dem Lauf, da dies ein Skript ist, das wiederholt ausgeführt wird.

Diese Punkte lassen mich denken, dass Python die Datei irgendwie bindet und bash kann nicht sehen/darauf zugreifen. Irgendwelche Ideen, wie diese Konvertierung ausgeführt werden kann?

Dank

Antwort

4

passieren einfach die csv_filename wird gzip für eine Datei suchen namens "file", die nicht so es Fehler nicht die csv_filename Datei nicht existiert:

subprocess.call(['gzip', csv_filename]) 

Es gibt keine file Argument für gzip, Sie einfach den Dateinamen übergeben.

1

Sie haben bereits die richtige Antwort auf Ihr Problem .... aber alternativ können Sie das Modul gzip verwenden, um während des Schreibens zu komprimieren, so dass Sie das gzip Programm überhaupt nicht aufrufen müssen. In diesem Beispiel wird davon ausgegangen, dass Sie Python 3.x verwenden und Sie nur ascii Text haben.

import gzip 

csv_filename = '/home/deploy/tablecopy/{0}.csv'.format(vertica_table) 

with gzip.open(csv_filename + '.gz', 'wt', encoding='ascii', newline='') as csv_file: 
    csv_writer = csv.writer(csv_file, delimiter=',') 
    for replacement in mongo_object.find(): 
     replacement_id = clean_value(replacement, "_id") 
     csv_writer.writerow([replacement_id, booking_id, style, added_ts]) 
+1

wenn ich das Gzip-Modul vertica konnte nicht lesen die Daten aus der Datei. Das ist ein separates Problem, das wahrscheinlich seine eigene Frage verdient – quaintm