2017-09-27 1 views
0

Ich habe einige Probleme mit os.path.join und einem Windows-System. Ich habe ein Skript erstellt, das rekursiv Dateien mit unstrukturierten JSON-Daten liest, ein Verzeichnis namens "converted_json" erstellt und den Inhalt jeder unstrukturierten JSON-Datei in einem strukturierten Format in eine neue Datei im Verzeichnis "converted_json" druckt.os.path.join Problem Windows

Ich habe das folgende Skript auf macOS getestet und bei der Ausführung werden die strukturierten JSON-Daten in neue Dateien gedruckt und die neuen Dateien werden in das Verzeichnis "converted_json" ausgegeben. Wenn ich das Skript jedoch auf einem Windows-System ausführe, werden die JSON-Daten in neue Dateien gedruckt, aber die Dateien werden nicht in das Verzeichnis "converted_json" ausgegeben.

Wesentlichen die folgenden os.path.joi n Code erscheint nicht im folgenden Abschnitt unter Windows zu funktionieren:

conv_json = open(os.path.join(converted_dir, str(file_name[-1]) + '_converted'), 'wb') 

Die Dateien erstellt werden, aber sie in der „converted_json“ Verzeichnis nicht gespeichert werden, die angegeben wird durch die Variable converted_dir.

Die folgende Ausgabe wird aus dem Drucken des "conv_json" -Variable:

open file 'C: \ Benutzer \ test \ Desktop \ test \ file_name.json.gz.json_converted' Mode 'wb' bei 0x0000000002617930

Wie von oben gesehen, der Dateipfad in der „conv_json“ enthaltene Variable enthält nicht das „converted_json“ Verzeichnis (sollte es dort aus seinem os.path.join verwenden und die converted_dir Variable.

Beliebig Unterstützung, wie die strukturierten Daten zur Ausgabe an "converted_json "Verzeichnis würde sehr geschätzt werden.

-Code unten:

argparser = argparse.ArgumentParser() 
argparser.add_argument('-d', '--d', dest='dir_path', type=str, default=None, required=True, help='Directory path to Archive/JSON files') 
args = argparser.parse_args() 
dir_path = args.dir_path 


converted_dir = os.path.join(dir_path, 'converted_json') 
os.mkdir(converted_dir, 0777) 

for subdir1, dirs1, files1 in os.walk(dir_path): 
    for file in files1: 

     try: 
      if file.endswith(".json"): 
       file = open(os.path.join(subdir1, file)) 
       file_name = str.split(file.name, '/') 

       conv_json = open(os.path.join(converted_dir, str(file_name[-1]) + '_converted'), 'wb') 

       conv_json.write('#################################################################################################################################') 
       conv_json.write('\n') 
       conv_json.write('File Name: ' + file_name[-1]) 
       conv_json.write('\n') 
       conv_json.write('#################################################################################################################################') 
       conv_json.write('\n') 

       parsed_json = json.load(file) 
       s = cStringIO.StringIO() 
       pprint.pprint(parsed_json, s) 

       conv_json.write(s.getvalue()) 

       conv_json.close() 

     except: 
      print 'JSON Files Not Found' 

print 'JSON Processing Completed: ' + str(datetime.datetime.now()) 

Antwort

0

Ich denke, dass diese Linie auf Windows schlecht ist:

file_name = str.split(file.name, '/') 

Die Spaltung auf '/' wird überhaupt nicht teilen. Sie sollten stattdessen os.path.sep verwenden.

Ich denke os.path.join reagiert so verwirrend, da der zweite Teil, den Sie versuchen, beizutreten, bereits ein vollständiger Dateipfad ist (seit dem Split fehlgeschlagen).

+0

Danke für die schnelle Antwort, ich werde in Ihren Vorschlag schauen. Vielen Dank! – user8685438