Python: Splitting a txt file and keep header

Question:

Say I have an input file like this (splitfile.txt):

INPUT
HEADER
OF A TXT FILE
line 1
line 2
line 3
line 4
line 5
line 6

I want to split these files and keep the three header lines like this:

INPUT
HEADER
OF A TXT FILE
line 1
line 2
INPUT
HEADER
OF A TXT FILE
line 3
line 4
INPUT
HEADER
OF A TXT FILE
line 5
line 6

My Python code so far is just only splitting up this textfile:

lines_per_file = 2
s = None
with open('splitfile.txt') as split:
    for lineno, line in enumerate(split):
        if lineno % lines_per_file == 0:
            if s:
                s.close()
            sfilename = 'step_{}.txt'.format(lineno + lines_per_file)
            s = open(sfilename, "w")
        s.write(line)
    if s:
        s.close()

How can I do this?

Asked By: testFreak

||

Answers:

you can read the header and save it in a variable to write to each new file you create.

lines_per_file = 2
s = None
with open('a.txt') as f:
    lines = f.readlines()
    headers, lines = lines[:3], lines[3:]
    for lineno, line in enumerate(lines):
        if lineno % lines_per_file == 0:
            if s:
                s.close()
            sfilename = f'step_{lineno + lines_per_file}.txt'
            s = open(sfilename, "w")
            s.writelines(headers)
        s.write(line)
    if s:
        s.close()

A cleaner answer:

LINES_PER_FILE = 2

def writer_to_file(name, headers, lines):
    with open(name, "w") as f:
        print(headers + lines)
        f.writelines(headers + lines)

with open('a.txt') as f:
    lines = f.readlines()
    headers, lines = lines[:3], lines[3:]
    [writer_to_file(f'step_{i + LINES_PER_FILE}.txt', headers, lines[i: i+LINES_PER_FILE]) for i in range(0, len(lines), LINES_PER_FILE)]

I prefer this one because there is no global variable s and by using with statement there is no need to worry about closing file.

Also it’s better to have UPPER_CASE constant variables.

Answered By: Parham.rm
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.