Home > Enterprise >  Combining two python scripts into one
Combining two python scripts into one

Time:10-17

I am a Python beginner.

I have these two working scripts:

import re

article_content = [open('input.txt').read() ]

split_article_content = []

for element in article_content:
    split_article_content  = re.split("(?<=[.!:;?])\s ", element)

print(*split_article_content, sep='\n\n')
pbcopy
with open("input.txt", "r") as f:
    buff = []
    i = 1
    for line in f:
        if line.strip():  #skips the empty lines
           buff.append(line)
        if line.strip() == "<end>":
           output = open('/%d.txt' % i,'w')
           output.write(''.join(buff))
           output.close()
           i =1
           buff = [] #buffer reset

The former makes each sentence a separate paragraph. The latter splits the input into separate output .txt files based on (or after each) specified symbol <end>.

The one script that I need to execute is this:

  • Make each sentence a separate paragraph split_article_content and split into separate output .txt files based on (after each) specified symbol <end> (while keeping the separate paragraphs in the final output).

To better illustrate:
Input

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec congue metus in nisl mollis egestas. 

Aenean iaculis arcu turpis, at iaculis leo dapibus eget. Donec in lacus vel justo fermentum sagittis. Maecenas vel dui quis nisi placerat porta in ac justo. Etiam porttitor nisl tincidunt enim pretium, ac vulputate tortor ultricies. Pellentesque eros massa, volutpat ac iaculis vitae, elementum ac leo. Curabitur sodales enim mattis lectus lobortis lobortis. 
<end>
Integer sagittis, lorem sit amet ultricies commodo, libero mauris porttitor lacus, vel tincidunt nunc diam sit amet quam. In hac habitasse platea dictumst. Ut et egestas velit. 
Suspendisse posuere, ligula sed dapibus dictum, lorem tellus faucibus est, non tincidunt tortor elit ac lacus. Proin dictum turpis sed tortor efficitur, ut aliquet dolor pretium. 

Praesent ac tincidunt nunc. Maecenas pharetra odio in lectus mattis imperdiet. Nullam tellus orci, tincidunt non odio eget, imperdiet tempus metus. Cras faucibus turpis vel rutrum elementum. 

Proin ut venenatis arcu. Ut consectetur tellus at erat ullamcorper, ac convallis nibh suscipit. Donec viverra dui ac metus vestibulum, quis luctus neque maximus. 
<end>
Cras blandit commodo mattis. Suspendisse eget lacinia nibh, eu viverra eros. Ut tincidunt, sapien eu interdum pulvinar, mauris tortor molestie sem, nec pulvinar orci quam fringilla mauris.

Pellentesque viverra, sapien sed dapibus semper, erat mauris lobortis ante, ut tempus augue sem sed urna. Praesent sed dui nec nisi aliquam blandit et eget risus. Vivamus egestas nunc ut varius auctor. Suspendisse id laoreet nisi. Mauris lobortis molestie risus ac condimentum. Fusce velit purus, finibus in mollis ac, blandit sed ligula. Curabitur mauris nisi, scelerisque et ultricies eget, malesuada eu velit.
<end>

1.txt output

Lorem ipsum dolor sit amet, consectetur adipiscing elit. 

Donec congue metus in nisl mollis egestas. 

Aenean iaculis arcu turpis, at iaculis leo dapibus eget. 

Donec in lacus vel justo fermentum sagittis. 

Maecenas vel dui quis nisi placerat porta in ac justo. 

Etiam porttitor nisl tincidunt enim pretium, ac vulputate tortor ultricies. 

Pellentesque eros massa, volutpat ac iaculis vitae, elementum ac leo. 

Curabitur sodales enim mattis lectus lobortis lobortis. 

<end>

2.txt output

Integer sagittis, lorem sit amet ultricies commodo, libero mauris porttitor lacus, vel tincidunt nunc diam sit amet quam. 

In hac habitasse platea dictumst. 

Ut et egestas velit. 

Suspendisse posuere, ligula sed dapibus dictum, lorem tellus faucibus est, non tincidunt tortor elit ac lacus. 

Proin dictum turpis sed tortor efficitur, ut aliquet dolor pretium.

Praesent ac tincidunt nunc. 

Maecenas pharetra odio in lectus mattis imperdiet. 

Nullam tellus orci, tincidunt non odio eget, imperdiet tempus metus. 

Cras faucibus turpis vel rutrum elementum. 

Proin ut venenatis arcu. 

Ut consectetur tellus at erat ullamcorper, ac convallis nibh suscipit. 

Donec viverra dui ac metus vestibulum, quis luctus neque maximus. 

<end>

... etc.

Best I could figure out:

import re

with open("input.txt", "r") as f:

    split_article_content = []
    for element in f:
        split_article_content  = re.split("(?<=[.!:;?])\s ", element)

    buff = []
    i = 1
    for line in f:
        if line.strip():  #skips the empty lines
            buff.append(line)
        if line.strip() == "<end>":
            output = open('%d.txt' % i,'w')
            output.write(''.join(buff))
            output.close()
            i =1
            buff = [] #buffer reset

I seem to struggle with:

  • keeping the separate paragraphs in the final output; or avoiding the latter part which separates the text to relapse back to output where paragraphs are not separated.
  • the use of reg. expression re when trying to combine these.

I would like to learn how to do this.

CodePudding user response:

For example:

import re

with open("input.txt", "r") as f:
    i = 1
    w = None
    for line in f:
        line = line.strip()
        if line:
            if line == "<end>":
                if w is not None:
                    w.close()
                    i  = 1
                    w = None
            else:
                if w is None:
                    w = open('output%i.txt' % i, 'w')
                for s in re.split("(?<=[.!:;?])\s ", line):
                    w.write(s   '\n\n')

Another version closer to your own attempt:

with open("input.txt", "r") as f:
    split_article_content = []
    for line in f:
        line = line.strip()
        if line:
            split_article_content  = re.split("(?<=[.!:;?])\s ", line)  
    buff = []
    i = 1
    for sentence in split_article_content:
        if sentence == "<end>":
            output = open('%d.txt' % i,'w')
            output.write('\n\n'.join(buff))
            output.close()
            i  = 1
            buff = []
        else:    
            buff.append(sentence)

CodePudding user response:

Your first script rather weirdly creates a single-element list and then loops over that lone element.

Your final attempt doesn't seem to do anything with the split sentences.

import re

i = 0
with open("input.txt", "r") as f:
    w = open('output%i.txt' % i, 'w')
    for line in f:

        if line == '<end>\n':
            w.write(line)
            w.close()
            i  = 1
            w = None
            continue

        for sent in re.split("(?<=[.!:;?])\s ", line):
            if w is None:
                w = open('output%i.txt' % i, 'w')
            w.write(sent   '\n')

We read a line at a time, and if it's <end> we close the current file; if not, we split into sentences, and write out each.

We avoid opening a new file after we closed the previous output file until we see that there is more data to write, which slightly complicates the script.

Looping over the elements and writing them out as we encounter them obviates the need to keep intermediate results in memory, and simplifes the flow.

  • Related