2016-04-06 40 views
1

我要拆分的Python字典,並將其寫入基於NO_OF_LINES_PER_FILE不同的文件和字典的大小分裂字典並將其寫入不同的csv文件在python

輸入

NO_OF_LINES_PER_FILE 

所以如果NO_OF_LINES_PER_FILE = 2和大小字典的爲10的我想字典被分裂成5個文件(每個文件將有2行)

腳本

import csv 
NO_OF_LINES_PER_FILE = 2 
s = {"2222":["1","2","3"],"3456":["2","3","4"],"5634":["4","5"],"23543":["456","3"],"29587":["4","5"],"244":["23","34"],"455":["3","4"],"244221":["5"],"23232345":["2323","43"]} 

def again(c,h,NO_OF_LINES_PER_FILE1): 
    f3 = open('num_'+str(h)+'.csv', 'at') 
    if c == 1: 
     ceh = 2 
    else: 
     ceh = c 
    print ceh 
    v = 0 
    for w in s: 
     v = v + 1 
     if v < ceh: 
      pass 
     elif v > NO_OF_LINES_PER_FILE1: 
      print "yes" 
      NO_OF_LINES_PER_FILE1 = NO_OF_LINES_PER_FILE1 + 1 
      h = NO_OF_LINES_PER_FILE1 + 1 
      again(c,h,NO_OF_LINES_PER_FILE1) 
     else: 
      writer = csv.writer(f3,delimiter = ',', lineterminator='\n',quoting=csv.QUOTE_ALL) 
      writer.writerow(s[w]) 

     c = c + 1 

def split(): 
    f3 = open('has_'+str(NO_OF_LINES_PER_FILE)+'.csv', 'at') 
    writer = csv.writer(f3,delimiter = ',', lineterminator='\n',quoting=csv.QUOTE_ALL) 
    c = 0 
    for w in s: 

     if c >= NO_OF_LINES_PER_FILE: 

      NO_OF_LINES_PER_FILE1 = NO_OF_LINES_PER_FILE + 1 
      h = NO_OF_LINES_PER_FILE 
      again(c,h,NO_OF_LINES_PER_FILE1) 
      break 
     else: 
      #print NO_OF_LINES_PER_FILE 
      writer = csv.writer(f3,delimiter = ',', lineterminator='\n',quoting=csv.QUOTE_ALL) 

      writer.writerow(s[w]) 

     c = c + 1 

split() 

但是這個腳本不能正常工作,並創造了許多文件

在上面的腳本NO_OF_LINES_PER_FILE = 2和字典S的尺寸是9

所以我要5個文件,前四個文件將包含2行,每行和第五個文件將包含1行

我該如何解決這個問題?

+0

這將有助於如果你能告訴您的輸入文件基礎的預期內容。 –

+0

預期內容:我想要一個鍵值([「1」,「2」,「3」])寫入CSV文件... – Mounarajan

+0

所以,你想單個文件存在與'([「1」 ,「2」,「3」])'在裏面?這就是你剛纔所說的,但這與你在問題中所描述的有很大不同。 –

回答

1

我的方法是平的字典,然後再拆平字典子列表長度爲你想

import csv 
    flatDict = [ i for i in s.items()] 
    splitFlatDict = [flatDict[i:i+NO_OF_LINES_PER_FILE] for i in xrange(0,len(flatDict),NO_OF_LINES_PER_FILE)] 
    for i,rows in enumerate(splitFlatDict): 
     with open(str(i) + '.csv','wb') as f: 
     writer = csv.writer(f) 
     writer.writerows(rows)