2017-01-26 2 views
-1

Ich habe den folgenden Code, um durch meine CSV-Werte zu durchlaufen. Eingangsdaten (Sample.csv):Python CSV-Konvertierung

name,city 
jack,nj 
matt,ny 

und erzeugen Ausgangs in JSON. Erforderlich Ausgabe

[ 
{"name": "jack","city": "PA"}, 
{"name": "matt","city": "CA"} 
] 

Ausgabe von Code:

[{"name,city": "jack,PA"};{"name,city": "matt,CA"};] 

Codebeispiel:

#!/usr/bin/python 

import json 
import csv 
csvfile = open('sample.csv', 'r') 
jsonfile = open('sample.csv'.replace('.csv','.json'), 'w') 

jsonfile.write('{\n[\n') 
fieldnames = csvfile.readline().replace('\n','').split(';') 
reader = csv.DictReader(csvfile, fieldnames, delimiter=';') 

from collections import OrderedDict 
    for row in reader: 
    json.dump(OrderedDict([(f, row[f]) for f in fieldnames]), jsonfile, indent=4) 
    jsonfile.write(';\n') 
    jsonfile.write(']\n}') 

fertige Ausgabe wird nicht in Schlüsselwertpaar auszurichten.

+0

FYI brauchen Sie nicht mit 'fieldnames' direkt, wenn die erste Zeile der CSV-Datei * zu behandeln ist * die Feldnamen. Außerdem ist nicht klar, warum Sie den JSON in der Ausgabedatei manuell verändern. Da das Trennzeichen eindeutig '' '' ist, verwenden Sie '' '' ?! – jonrsharpe

+0

Ich bin neu in Python, ich habe andere Beispiele ausprobiert, aber das ist Wert an eine Liste anhängen, die viel Zeit bei der Konvertierung von Dateien über 1 GB dauert. Stattdessen möchte ich an die json-Ausgabedatei anhängen, anstatt sie im Speicher zu behalten. Dieses ist der Code, der mich näher zu dem brachte, was ich andere Lösung brauchte: http://stackoverflow.com/a/32158933/884808 – jb04

+0

Aber Sie schließen das Array nach jedem Einzelteil darin, und unerklärlicherweise verwenden Sie Semikolons innerhalb es . Wenn Sie JSON manuell schreiben, empfehle ich, mit der gültigen Syntax vertraut zu sein. – jonrsharpe

Antwort

0

Ich konnte erreichen, was ich brauchte, vielleicht nicht die bestmögliche Lösung, aber sicherlich, was ich jetzt suchte.

import sys, getopt 
ifile='' 
ofile='' 
format='' 

#get argument list using sys module 
myopts, args = getopt.getopt(sys.argv[1:],"i:o:f") 

for o,a in myopts: 
      if o == '-i': 
         ifile=a 
      elif o == '-o': 
         ofile=a 
      elif o == '-f': 
         format=a 
      else: 
         print("Usage: %s -i input -o output -f format" % sys.argv[0]) 

#Reset the output file for each run 
reset = open(ofile,"w+") 
reset.close() 

#Read CSV in a ordered Column Format & output in JSON format 

from collections import OrderedDict 
import csv 
import json 
import os 
with open(ifile,'r') as f: 
    reader = csv.reader(f,delimiter=',', quotechar='"') 
    headerlist = next(reader) 
    for row in reader: 
      d = OrderedDict() 
      for i, x in enumerate(row): 
        print x 
        d[headerlist[i]] = x 
      with open(ofile,'a') as m: 
       if format == "pretty": 
        m.write(json.dumps(d, sort_keys=False, indent=4, separators=(',', ': '),encoding="utf-8",ensure_ascii=False)) 
        m.write(',\n') 
       else: 
        m.write(json.dumps(d)) 
        m.write(',\n') 


#Module to remove the trailing delimiter 

file = open(ofile, "r+") 
file.seek(0, os.SEEK_END) 
pos = file.tell() - 1 
while pos > 0 and file.read(1) != ",": 
    pos -= 1 
    file.seek(pos, os.SEEK_SET) 


if pos > 0: 
    file.seek(pos, os.SEEK_SET) 
    file.truncate() 
file.writelines('\n') 
file.close()