2016-11-06 112 views
0

我試圖將一個非常大的文本文件分割成多個較小的文件。當我運行下面的代碼時,第一個創建的文件是正確的。之後的所有內容都只包含'INSERT INTO ...'字符串,沒有別的。在此先感謝動態地將文件分割成多個較小的文件

import math 
interval = 100000 

with open('my-big-file','r') as c: 
    for i, l in enumerate(c): 
     pass 
    length = i + 1 

    numOfFiles = int(math.ceil(length/interval)) 

with open('my-big-file','r') as c: 
    for j in range(0, numOfFiles): 
     with open('my-smaller-file_{}.sql'.format(j),'w') as n: 
      print >> n, 'INSERT INTO codes (code, some-field, some-other-field) VALUES' 
      for i, line in enumerate(c): 
       if i >= j * interval and i < (j + 1) * interval: 
        line = line.rstrip() 
        if not line: continue 

        print >> n, '(%s,'something','something else'),' % (line) 

       else: 
        break 

回答

0

你並不需要遍歷文件之前數行數,你可以直接寫入到一個新的文件,只要你達到給定的行數:

#!/usr/bin/env python 

def split(fn, num=1000, suffix="_%03d"): 
    import os 

    full, ext = os.path.splitext(fn) 

    with open(fn, 'r') as f: 
     for i, l in enumerate(f): 
      if i%num == 0: 
       try: 
        out.close() 
       except UnboundLocalError: 
        pass 
       out = open(full+suffix%(i/num)+ext, 'w') 
      out.write(l) 
     else: 
      out.close() 


if __name__ == '__main__': 
    import sys 
    split(sys.argv[1]) 

你可以從命令行運行它。雖然可能split command更有用,因爲它支持多種選項。

也可以重寫此代碼以使用with作爲正在寫入的文件,但這是另一個主題。

+0

這是完美的工作。正是我想要做的!謝謝 – knnnrd

相關問題