我有一个文件,其中包含一些代码行,后跟一个字符串模式。我需要在文件一中包含字符串模式的行之前写入所有内容,在文件二中的字符串模式之后写入所有内容:
e.g。 (文件的内容)
输出应该是带有代码行1的文件1,代码行2和带有代码行3的文件2。
我熟悉编写文件,但遗憾的是我不知道如何确定字符串模式之前和之后的内容。
答案 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行的任何内容都可以)。