Python Forum

Full Version: Merge 2 lines with delimiter
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
So I have code that prints out a into a file like this:
Quote:xxx.xxx.xx.xx
yyyy
#5 blank line gap
xxx.xxx.xx.xx
yyyy
#5 blank line gap
#This repeats for a while

I need to merge the 'x' and 'y' with a ':' delimiter

So end file will look like:
Quote:xxx.xxx.xx.xx:yyyy
xxx.xxx.xx.xx:yyyy
xxx.xxx.xx.xx:yyyy
xxx.xxx.xx.xx:yyyy
#etc.
What have you tried?
>>> text = '''xxx.xxx.xx.xx
... yyyy
...
...
...
...
...
... xxx.xxx.xx.xx
... yyyy
...
...
...
...
...
... xxx.xxx.xx.xx
... yyyy'''
>>> lines = text.split('\n')
>>> lines
['xxx.xxx.xx.xx', 'yyyy', '', '', '', '', '', 'xxx.xxx.xx.xx', 'yyyy', '', '', '', '', '', 'xxx.xxx.xx.xx', 'yyyy']
>>> lines = [line for line in lines if line] # remove blanks
>>> lines
['xxx.xxx.xx.xx', 'yyyy', 'xxx.xxx.xx.xx', 'yyyy', 'xxx.xxx.xx.xx', 'yyyy']
>>> pairs = [(lines[i-1], lines[i]) for i in range(1, len(lines), 2)]
>>> pairs
[('xxx.xxx.xx.xx', 'yyyy'), ('xxx.xxx.xx.xx', 'yyyy'), ('xxx.xxx.xx.xx', 'yyyy')]
>>> '\n'.join(':'.join(pair) for pair in pairs)
'xxx.xxx.xx.xx:yyyy\nxxx.xxx.xx.xx:yyyy\nxxx.xxx.xx.xx:yyyy'
>>> print('\n'.join(':'.join(pair) for pair in pairs))
xxx.xxx.xx.xx:yyyy
xxx.xxx.xx.xx:yyyy
xxx.xxx.xx.xx:yyyy
(May-03-2019, 08:28 PM)nilamo Wrote: [ -> ]
>>> text = '''xxx.xxx.xx.xx
... yyyy
...
...
...
...
...
... xxx.xxx.xx.xx
... yyyy
...
...
...
...
...
... xxx.xxx.xx.xx
... yyyy'''
>>> lines = text.split('\n')
>>> lines
['xxx.xxx.xx.xx', 'yyyy', '', '', '', '', '', 'xxx.xxx.xx.xx', 'yyyy', '', '', '', '', '', 'xxx.xxx.xx.xx', 'yyyy']
>>> lines = [line for line in lines if line] # remove blanks
>>> lines
['xxx.xxx.xx.xx', 'yyyy', 'xxx.xxx.xx.xx', 'yyyy', 'xxx.xxx.xx.xx', 'yyyy']
>>> pairs = [(lines[i-1], lines[i]) for i in range(1, len(lines), 2)]
>>> pairs
[('xxx.xxx.xx.xx', 'yyyy'), ('xxx.xxx.xx.xx', 'yyyy'), ('xxx.xxx.xx.xx', 'yyyy')]
>>> '\n'.join(':'.join(pair) for pair in pairs)
'xxx.xxx.xx.xx:yyyy\nxxx.xxx.xx.xx:yyyy\nxxx.xxx.xx.xx:yyyy'
>>> print('\n'.join(':'.join(pair) for pair in pairs))
xxx.xxx.xx.xx:yyyy
xxx.xxx.xx.xx:yyyy
xxx.xxx.xx.xx:yyyy

This looks very good, but I is from a text file which includes the text.
otherwise I could just do
Quote:x = "xxx.xxx.xx.xx"
y = "yyyy"
print (x + ":" + y)
print ("\n")


Or am I wrong?
(May-03-2019, 08:56 PM)Buddhism Wrote: [ -> ]Or am I wrong?
It will not work like this when reading from a file,x and y variables will just be overwritten when read each line from file.
Therefor is it easiest to first make a list as @nilmao dos,then make changes on list.
Here an other approach.
def line_concat(lst):
    temp = zip(lst[::2], lst[::-2])
    return [':'.join(i) for i in temp]

with open('xy.txt') as f:
    lst = [line.strip() for line in f if not line.isspace()]
Test.
>>> lst
['xxx.xxx.xx.xx', 'yyyy', 'xxx.xxx.xx.xx', 'yyyy']

>>> line_concat(lst)
['xxx.xxx.xx.xx:yyyy', 'xxx.xxx.xx.xx:yyyy']
>>> for line in line_concat(lst):
...     print(line)
...     
xxx.xxx.xx.xx:yyyy
xxx.xxx.xx.xx:yyyy
(May-04-2019, 12:23 AM)snippsat Wrote: [ -> ]
(May-03-2019, 08:56 PM)Buddhism Wrote: [ -> ]Or am I wrong?
It will not work like this when reading from a file,x and y variables will just be overwritten when read each line from file.
Therefor is it easiest to first make a list as @nilmao dos,then make changes on list.
Here an other approach.
def line_concat(lst):
    temp = zip(lst[::2], lst[::-2])
    return [':'.join(i) for i in temp]

with open('xy.txt') as f:
    lst = [line.strip() for line in f if not line.isspace()]
Test.
>>> lst
['xxx.xxx.xx.xx', 'yyyy', 'xxx.xxx.xx.xx', 'yyyy']

>>> line_concat(lst)
['xxx.xxx.xx.xx:yyyy', 'xxx.xxx.xx.xx:yyyy']
>>> for line in line_concat(lst):
...     print(line)
...     
xxx.xxx.xx.xx:yyyy
xxx.xxx.xx.xx:yyyy

Am I doing something wrong?
[Image: IGFJ11i.png]
You are seeing the last of the code. Those last lines are whats running. Everything else is def
The file that the program is working with the whole time is ScrapedProxys.txt

KEEP IN MIND: list_concat(lst) is above this image to run the def
But this is the error

[Image: MMTJ1Oi.png]
Try to use code tags and not images with code,look at BBCode.
In my example i am running the last part in interactive shell has >>>.
Now you have put all in one function and that will not work as i have written it.
Here a example running as a script,see that need print() when running as a script.
def line_concat(lst):
    temp = zip(lst[::2], lst[::-2])
    return [':'.join(i) for i in temp]

def file_read(file_in):
    with open(file_in) as f:
        lst = [line.strip() for line in f if not line.isspace()]
        return lst

if __name__ == '__main__':
    file_in = 'xy.txt'
    lst = file_read(file_in)
    print(lst) # Test file read
    for line in line_concat(lst):
        print(line) 
Output:
['xxx.xxx.xx.xx', 'yyyy', 'xxx.xxx.xx.xx', 'yyyy'] xxx.xxx.xx.xx:yyyy xxx.xxx.xx.xx:yyyy
xy.txt that i use to test with is:
Output:
xxx.xxx.xx.xx yyyy xxx.xxx.xx.xx yyyy
(May-04-2019, 07:45 AM)snippsat Wrote: [ -> ]Try to use code tags and not images with code,look at BBCode.
In my example i am running the last part in interactive shell has >>>.
Now you have put all in one function and that will not work as i have written it.
Here a example running as a script,see that need print() when running as a script.
def line_concat(lst):
    temp = zip(lst[::2], lst[::-2])
    return [':'.join(i) for i in temp]

def file_read(file_in):
    with open(file_in) as f:
        lst = [line.strip() for line in f if not line.isspace()]
        return lst

if __name__ == '__main__':
    file_in = 'xy.txt'
    lst = file_read(file_in)
    print(lst) # Test file read
    for line in line_concat(lst):
        print(line) 
Output:
['xxx.xxx.xx.xx', 'yyyy', 'xxx.xxx.xx.xx', 'yyyy'] xxx.xxx.xx.xx:yyyy xxx.xxx.xx.xx:yyyy
xy.txt that i use to test with is:
Output:
xxx.xxx.xx.xx yyyy xxx.xxx.xx.xx yyyy

Here is what I've got. The file, when I open it, is unchanged from before I added the code.
Thank you for the help so far, this stuff can just get confusing

Heres the code now:

Quote:
def line_concat(lst):
    temp = zip(lst[::2], lst[::-2])
    return [':'.join(i) for i in temp]

def file_read(file_in):
    with open(file_in) as f:
        lst = [line.strip() for line in f if not line.isspace()]
        return lst



if __name__ == '__main__':
    with open("ScrapedProxys.txt","w+") as t:
        t.close()
    main()
    file_in = "ScrapedProxys.txt"
    lst = file_read(file_in)
    for line in line_concat(lst):
        f.write(line)


Clear()

input("Press Enter to Exit")

The
Quote:with open("ScrapedProxys.txt","w+") as t:
is to create the file on start
You use close() that's not needed when use with open and there is no write().
Here how it look if write result to file.
def line_concat(lst):
    temp = zip(lst[::2], lst[::-2])
    return [':'.join(i) for i in temp]

def file_read(file_in):
    with open(file_in) as f:
        lst = [line.strip() for line in f if not line.isspace()]
        return lst

if __name__ == '__main__':
    file_in = 'xy.txt'
    lst = file_read(file_in)
    #print(lst) # Test file read
    with open('xy_new.txt', 'w') as f_out:
        for line in line_concat(lst):
            f_out.write(f'{line}\n')
(May-04-2019, 08:21 PM)snippsat Wrote: [ -> ]You use close() that's not needed when use with open and there is no write().
Here how it look if write result to file.
def line_concat(lst):
    temp = zip(lst[::2], lst[::-2])
    return [':'.join(i) for i in temp]

def file_read(file_in):
    with open(file_in) as f:
        lst = [line.strip() for line in f if not line.isspace()]
        return lst

if __name__ == '__main__':
    file_in = 'xy.txt'
    lst = file_read(file_in)
    #print(lst) # Test file read
    with open('xy_new.txt', 'w') as f_out:
        for line in line_concat(lst):
            f_out.write(f'{line}\n')


Thank you so much!
After some error on my side of files showing up blank, I got it with your help!

Cheers!