Search code examples
python-3.xloopsfor-loopreplaceline

For each line "for loop" cant implement in my script


I'am completely new to Python and I'm struggling currently with an "easy" step for most of you.

My Target is to copy and paste lines from one source file to a target file. BUT. The Targetfiles should keep their first 12 lines. after the 12 lines it should take ALL lines from the source file. Works great so far. I only have to set the lines for the last part.

So I have to put in a loop thats like " for each line you find replace it in the target file)

config_fstab = '# /etc/fstab: static file system information.'
einhaengepunkte_replace = '#Eigene_Einhaengepunkte'

with open(r'C:\Users\sample\Desktop\SCRIPTING02.txt') as input_header_stays:
    with open(r'C:\Users\sample\Desktop\ZWISCHENSPEICHER.txt','w') as zwischenspeicher:
        zeilen = input_header_stays.readlines()
        for i, line in enumerate(zeilen):
            if line.startswith(config_fstab):
                zwischenspeicher.write(line)
                zwischenspeicher.write(zeilen[i + 1])
                zwischenspeicher.write(zeilen[i + 2])
                zwischenspeicher.write(zeilen[i + 3])
                zwischenspeicher.write(zeilen[i + 4])
                zwischenspeicher.write(zeilen[i + 5])
                zwischenspeicher.write(zeilen[i + 6])
                zwischenspeicher.write(zeilen[i + 7])
                zwischenspeicher.write(zeilen[i + 8])
                zwischenspeicher.write(zeilen[i + 9])
                zwischenspeicher.write(zeilen[i + 10])
                zwischenspeicher.write(zeilen[i + 11])
                zwischenspeicher.write(zeilen[i + 12])
input_header_stays.close()
zwischenspeicher.close()

with open(r'C:\Users\sample\Desktop\SCRIPTING.txt') as input_scripting_fstab:
    with open(r'C:\Users\sample\Desktop\ZWISCHENSPEICHER.txt','a') as zwischenspeicher:
        zeilen = input_scripting_fstab.readlines()
        for i, line in enumerate(zeilen):
            if line.startswith(einhaengepunkte_replace):
                zwischenspeicher.write(line)
                zwischenspeicher.write(zeilen[i + 1])
                zwischenspeicher.write(zeilen[i + 2])
                zwischenspeicher.write(zeilen[i + 3])
                zwischenspeicher.write(zeilen[i + 4])
                zwischenspeicher.write(zeilen[i + 5])
                zwischenspeicher.write(zeilen[i + 6])
                zwischenspeicher.write(zeilen[i + 7])
                zwischenspeicher.write(zeilen[i + 8])
                zwischenspeicher.write(zeilen[i + 9])
                zwischenspeicher.write(zeilen[i + 10])
                zwischenspeicher.write(zeilen[i + 11])
                zwischenspeicher.write(zeilen[i + 12])
                zwischenspeicher.write(zeilen[i + 13])
                zwischenspeicher.write(zeilen[i + 14])
                zwischenspeicher.write(zeilen[i + 15])
                zwischenspeicher.write(zeilen[i + 16])

input_scripting_fstab.close()
zwischenspeicher.close()

That's my code.

I think the tricky part where I need help is this one:

with open(r'C:\Users\sample\Desktop\SCRIPTING.txt') as input_scripting_fstab:
    with open(r'C:\Users\sample\Desktop\ZWISCHENSPEICHER.txt','a') as zwischenspeicher:
        zeilen = input_scripting_fstab.readlines()
        for i, line in enumerate(zeilen):
            if line.startswith(einhaengepunkte_replace):
                zwischenspeicher.write(line)
                zwischenspeicher.write(zeilen[i + 1])
                zwischenspeicher.write(zeilen[i + 2])
                zwischenspeicher.write(zeilen[i + 3])
                zwischenspeicher.write(zeilen[i + 4])
                zwischenspeicher.write(zeilen[i + 5])
                zwischenspeicher.write(zeilen[i + 6])
                zwischenspeicher.write(zeilen[i + 7])
                zwischenspeicher.write(zeilen[i + 8])
                zwischenspeicher.write(zeilen[i + 9])
                zwischenspeicher.write(zeilen[i + 10])
                zwischenspeicher.write(zeilen[i + 11])
                zwischenspeicher.write(zeilen[i + 12])
                zwischenspeicher.write(zeilen[i + 13])
                zwischenspeicher.write(zeilen[i + 14])
                zwischenspeicher.write(zeilen[i + 15])
                zwischenspeicher.write(zeilen[i + 16])

The lines are getting more and I can't put lines in by myself. That's where my Python script needs brain.


Solution

  • You don't need enumerate if you only want to copy after a certain point to the end of the file.

    
    einhaengepunkte_replace = '#Eigene_Einhaengepunkte'
    
    with open(r'C:\Users\sample\Desktop\SCRIPTING.txt', 'r') as input_scripting_fstab:
        zeilen = input_scripting_fstab.readlines()
    
    with open(r'C:\Users\sample\Desktop\ZWISCHENSPEICHER.txt', 'a') as zwischenspeicher:
        writing = False
        for line in zeilen:
            # This flag just tells us when to start writing
            if line.startswith(einhaengepunkte_replace):
                writing = True
    
            if writing:
                zwischenspeicher.write(line)
    

    Since you have a pattern you could even throw it into a function.

    def copy_it(source='', destination='', start_point='', mode='a'):
        with open(source, 'r') as source_file:
            source_lines = source_file.readlines()
    
        with open(destination, mode) as dest_file:
            writing = False
            for line in source_lines:
                if line.startswith(start_point):
                    writing = True
    
                if writing:
                    dest_file.write(line)
    
    
    copy_it(source=r'C:\Users\sample\Desktop\SCRIPTING.txt',
            destination=r'C:\Users\sample\Desktop\ZWISCHENSPEICHER.txt',
            start_point='#Eigene_Einhaengepunkte')
    
    copy_it(source=r'C:\Users\sample\Desktop\SCRIPTING02.txt',
            destination=r'C:\Users\sample\Desktop\ZWISCHENSPEICHER.txt',
            start_point='# /etc/fstab: static file system information.',
            mode='w')