Python Forum
how to remove \n from file? - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: how to remove \n from file? (/thread-32329.html)



how to remove \n from file? - shams - Feb-03-2021

This python code writing configuration file for getmail to retrieve the mail, in the first and last f.write code i use the "\n" to break the lines for new line:
cur  = conn.cursor() 
query = "SELECT user, passwd, server FROM pop"
cur.execute(query)
for idx, row in enumerate(cur, start=1):
	with open(f'mail{idx}', 'w') as f:
		
		f.write('[options]\n verbose = 1\n read_all = false\n delete = true\n received = false\n delivered_to = false\n message_log = /home/mail/log\n message_log_verbose = true\n ')
		f.write('username = ')
		f.write(row[0])
		f.write("\n")
		f.write(' password = ')
		f.write(row[1])
		f.write("\n")
		f.write(' server = ')
		f.write(row[2])
		f.write("\n")
		f.write('[destination]\n type = MDA_external\n path = /usr/bin/exim\n arguments = ("-i", "-bm", "user@localhost")\n unixfrom = true\n ')
with cat the file seem ok there is no '\n' in the end of lines, but when run the getmail get the error:
Configuration error: configuration file /home/mail/mail1 incorrect (File contains parsing errors: /home/mail/mail1
	[line  2]: ' verbose = 1\n'
	[line  3]: ' read_all = false\n'
	[line  4]: ' delete = true\n'
	[line  5]: ' received = false\n'
	[line  6]: ' delivered_to = false\n'
how to remove the '\n' from the end of lines.


RE: how to remove \n from file? - bowlofred - Feb-03-2021

If you remove the newline, they won't be separate lines.

I suspect the error is telling you that you have whitespace at the beginning of the lines. For getmail, the configuration assumes that if it starts with whitespace it is a continuation of the previous line.

Quote:A parameter value, if necessary, can span multiple lines. To indicate that the second and subsequent lines form a continuation of the previous line, they need to begin with leading whitespace, like this:
first_parameter = value
    first parameter value continues here
second_parameter = value

Get rid of the leading whitespace.


RE: how to remove \n from file? - buran - Feb-03-2021

instead of writing the file like you do, look at configparser module from standard library. Your code will be way more clean and readable

import configparser

my_config="""[options]
verbose = 1
read_all = false
delete = true
received = false
delivered_to = false
message_log = /home/mail/log
message_log_verbose = true

[destination]
type = MDA_external
path = /usr/bin/exim
arguments = ("-i", "-bm", "user@localhost")
unixfrom = true"""

config = configparser.ConfigParser()
config.read_string(my_config)

cur  = conn.cursor() 
query = "SELECT user, passwd, server FROM pop"
cur.execute(query)
for idx, row in enumerate(cur, start=1):
    credentials = dict(zip(('username', 'password', 'server'), row))
    config['options'].update(credentials)
    with open(f'mail{idx}', 'w') as f:
        config.write(f)
instead of string my_config can be a dict

Also I don't know if MariaDB python connector supports DictCursor like MySQL connector, but if it does - you can use it.


RE: how to remove \n from file? - shams - Feb-04-2021

Thanks for replies, yes also the problem was with the white spaces after \n i remove the all spaces after \n now it working, also special thanks to buran for the perfect code, it is working nice, the only thing is i forgot to add two lines (one section), i tried to add these lines to the code but failed, can you please add these two lines to the code so the configuration file just look like this:
[options]
verbose = 1
read_all = false
delete = true
received = false
delivered_to = false
message_log = /home/mail/log
message_log_verbose = true

[retriever]
type = SimplePOP3Retriever
username = [email protected]
password = ******
server = pop.gmail.com

[destination]
type = MDA_external
path = /usr/bin/exim
arguments = ("-i", "-bm", "user@localhost")
unixfrom = true



RE: how to remove \n from file? - buran - Feb-04-2021

(Feb-04-2021, 07:00 AM)shams Wrote: i tried to add these lines to the code but failed
C'mon, it couldn't be that difficult. Show what have you tried


RE: how to remove \n from file? - shams - Feb-04-2021

i added the lines as this:
my_config="""[options]
verbose = 1
read_all = false
delete = true
received = false
delivered_to = false
message_log = /home/mail/log
message_log_verbose = true

[retriever]
type = SimplePOP3Retriever
 
[destination]
type = MDA_external
path = /usr/bin/exim
arguments = ("-i", "-bm", "user@localhost")
unixfrom = true"""
 
config = configparser.ConfigParser()
config.read_string(my_config)
 
cur  = conn.cursor() 
query = "SELECT user, passwd, server FROM pop"
cur.execute(query)
for idx, row in enumerate(cur, start=1):
    credentials = dict(zip(('username', 'password', 'server'), row))
    config['options'].update(credentials)
    with open(f'mail{idx}', 'w') as f:
        config.write(f)
and this was the output:
[options]
verbose = 1
read_all = false
delete = true
received = false
delivered_to = false
message_log = /home/mail/log
message_log_verbose = true
username = [email protected]
password = ******
server = pop.gmail.com

[retriever]
type = SimplePOP3Retriever

[destination]
type = MDA_external
path = /usr/bin/exim
arguments = ("-i", "-bm", "user@localhost")
unixfrom = true
i changed the double quotes to the deferent positions but no luck.


RE: how to remove \n from file? - buran - Feb-04-2021

look at line 27. You need to update that too, to update retriever section, not options.


RE: how to remove \n from file? - shams - Feb-04-2021

Thanks for the help i just changed to update the retriever instead of option, now every thing is going ok.