2017-01-26 127 views
-1

我有以下代碼來遍歷我的CSV值。輸入數據(Sample.csv):Python csv轉換

name,city 
jack,nj 
matt,ny 

和JSON創建輸出。從代碼所需的輸出

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

輸出:

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

代碼示例:

#!/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}') 

最終輸出是不對準成鍵值對。

+0

僅供參考如果CSV文件的第一行*爲字段名稱,則不需要直接處理字段名。此外,還不清楚爲什麼要手動修改輸出文件中的JSON。另外,鑑於分隔符顯然是',',爲什麼你繼續使用';'?! – jonrsharpe

+0

我是Python的新手,我嘗試了其他的例子,但是它將值附加到一個列表中,這個列表在轉換超過1 GB的文件時花費了大量的時間。相反,我想附加到json輸出文件,而不是將其保存在內存中。這是讓我更接近我需要的代碼 其他解決方案:http://stackoverflow.com/a/32158933/884808 – jb04

+0

但是你關閉數組後每個項目後,莫名其妙地使用分號。如果您要手動編寫JSON,我建議您熟悉有效的語法。 – jonrsharpe

回答

0

我能夠實現我所需要的,可能不是最好的解決方案,但肯定是我現在正在尋找的。

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