将文件动态拆分为多个较小的文件

时间:2016-11-06 11:02:21

标签: python file text-files

我正在尝试将一个非常大的文本文件拆分成多个较小的文本文件。当我运行下面的代码时,第一个创建的文件是正确的。之后的所有内容只包含'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

1 个答案:

答案 0 :(得分: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用于正在写入的文件,但这是另一个主题。