2

Is it possible to use python to skip blocks of text when writing a file from another file?

For example lets say the input file is:

This is the file I would like to write this line
I would like to skip this line
and this one...
and this one...
and this one...
but I want to write this one
and this one...

How can I write a script that allows me to skip certain lines that differ in content and size which resumes writing the lines to another file once it recognizes a certain line?

My code reads through the lines, doesn't write duplicate lines and performs some operation on the line by using dictionaries and regex.

1
  • 1
    That entirely depends on why you want to skip those lines. There needs to be some codeable rule to select some lines and not others. Assuming you have that rule, this program becomes pretty simple really... Commented Jan 21, 2015 at 16:54

4 Answers 4

3
def is_wanted(line):
    #
    # You have to define this!
    #
    # return True to keep the line, or False to discard it

def copy_some_lines(infname, outfname, wanted_fn=is_wanted):
    with open(infname) as inf, open(outfname, "w") as outf:
        outf.writelines(line for line in inf if wanted_fn(line))

copy_some_lines("file_a.txt", "some_of_a.txt")

In order to extend this to multi-line blocks, you can implement a finite state machine like

enter image description here

which would turn into something like

class BlockState:
    GOOD_BLOCK = True
    BAD_BLOCK = False

    def __init__(self):
        self.state = self.GOOD_BLOCK

    def is_bad(self, line):
        # *** Implement this! ***
        # return True if line is bad

    def is_good(self, line):
        # *** Implement this! ***
        # return True if line is good

    def __call__(self, line):
        if self.state == self.GOOD_BLOCK:
            if self.is_bad(line):
                self.state = self.BAD_BLOCK
        else:
            if self.is_good(line):
                self.state = self.GOOD_BLOCK
        return self.state

then

copy_some_lines("file_a.txt", "some_of_a.txt", BlockState())
Sign up to request clarification or add additional context in comments.

Comments

2

Pseudo-code:

# Open input and output files, and declare the unwanted function
for line in file1:
    if unwanted(line):
        continue
    file2.write(line)
# Close files etc...

Comments

0

You can read the file line by line, and have control on each line you read:

with open(<your_file>, 'r') as lines:
    for line in lines:
        # skip this line
        # but not this one

Note that if you want to read all lines despite the content and only then manipulate it, you can:

with open(<your_file>) as fil:
    lines = fil.readlines()

Comments

0

This should work:

SIZE_TO_SKIP = ?
CONTENT_TO_SKIP = "skip it"

with open("my/input/file") as input_file:
    with open("my/output/file",'w') as output_file:
        for line in input_file:
            if len(line)!=SIZE_TO_SKIP and line!=CONTENT_TO_SKIP:
                output_file.write(line)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.