如何使用Python将一个文件拆分为两个文件?

时间:2012-06-13 18:17:29

标签: python file split

我有一个文件,其中包含一些代码行,后跟一个字符串模式。我需要在文件一中包含字符串模式的行之前写入所有内容,在文件二中的字符串模式之后写入所有内容:

e.g。 (文件的内容)

  • codeline 1
  • codeline 2
  • 字符串模式
  • codeline 3

输出应该是带有代码行1的文件1,代码行2和带有代码行3的文件2。

我熟悉编写文件,但遗憾的是我不知道如何确定字符串模式之前和之后的内容。

7 个答案:

答案 0 :(得分:9)

如果输入文件适合内存,最简单的解决方案是使用str.partition()

with open("inputfile") as f:
    contents1, sentinel, contents2 = f.read().partition("Sentinel text\n")
with open("outputfile1", "w") as f:
    f.write(contents1)
with open("outputfile2", "w") as f:
    f.write(contents2)

这假设您知道将两个部分分开的行的确切文本。

答案 1 :(得分:5)

此方法与Lev's类似,但使用itertools因为它很有趣。

 dont_break = lambda l: l.strip() != 'string_pattern'

 with open('input') as source:
     with open('out_1', 'w') as out1:
         out1.writelines(itertools.takewhile(dont_break, source))
     with open('out_2', 'w') as out2:
         out2.writelines(source)

如果需要,您可以使用正则表达式或其他任何内容替换dont_break函数。

答案 2 :(得分:3)

with open('data.txt') as inf, open('out1.txt','w') as of1, open('out2.txt','w') as of2:
    outf = of1
    for line in inf:
        if 'string pattern' in line:
            outf = of2
            continue  # prevent output of the line with "string pattern" 
        outf.write(line)

将使用大文件,因为它逐行工作。假设string pattern仅在输入文件中出现一次。我喜欢str.partition()方法最好如果整个文件可以放入内存(这可能不是问题)

使用with可确保文件在完成后自动关闭,或遇到异常。

答案 3 :(得分:2)

一个天真的例子(不会像Sven那样将文件加载到内存中):

with open('file', 'r') as r:
    with open('file1', 'w') as f:
        for line in r:
            if line == 'string pattern\n':
                break
            f.write(line)
    with open('file2', 'w') as f:
        for line in r:
            f.write(line)

这假设'string pattern'在输入文件中出现一次。

如果模式不是固定字符串,则可以使用re模块。

答案 4 :(得分:2)

一个更有效的答案,它将处理大文件并消耗有限的内存..

inp = open('inputfile')
out = open('outfile1', 'w')
for line in inp:
  if line == "Sentinel text\n":
    out.close()
    out = open('outfile2', 'w')
  else:
    out.write(line)
out.close()
inp.close()

答案 5 :(得分:2)

不超过三行:

with open('infile') as fp, open('of1','w') as of1, open('of2','w') as of2:
    of1.writelines(iter(fp.readline, sentinel))
    of2.writelines(fp)

答案 6 :(得分:1)

您需要以下内容:

def test_pattern(x):
    if x.startswith('abc'): # replace this with some exact test
        return True
    return False

found = False
out = open('outfile1', 'w')
for line in open('inputfile'):
    if not found and test_pattern(line):
        found = True
        out.close()
        out = open('outfile2', 'w')
    out.write(line)
out.close()

使用适用于您的模式的测试替换带有startswith的行(如果需要,使用re中的模式匹配,但是找到devider行的任何内容都可以)。