2016-11-06 135 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

相关问题