Strange behaviour with os.linesep

Vincent Vande Vyvre vincent.vandevyvre at swing.be
Tue Jul 23 09:10:35 EDT 2013


Le 23/07/2013 14:39, Jason Swails a écrit :
>
>
>
> On Tue, Jul 23, 2013 at 7:42 AM, Vincent Vande Vyvre 
> <vincent.vandevyvre at swing.be <mailto:vincent.vandevyvre at swing.be>> wrote:
>
>     On Windows a script where de endline are the system line sep, the
>     files are open with a double line in Eric4, Notepad++ or Gedit but
>     they are correctly displayed in the MS Bloc-Notes.
>
>     Example with this code:
>     ----------------------------------------------
>     # -*- coding: utf-8 -*-
>
>     import os
>     L_SEP = os.linesep
>
>     def write():
>         strings = ['# -*- coding: utf-8 -*-\n',
>                     'import os\n',
>                     'import sys\n']
>         with open('writetest.py', 'w') as outf:
>             for s in strings:
>                 outf.write(s.replace('\n', L_SEP))
>
>
> I must ask why you are setting strings with a newline line ending only 
> to replace them later with os.linesep.  This seems convoluted compared 
> to doing something like
>
> def write():
> strings = ['#-*- coding: utf-8 -*-', 'import os', 'import sys']
>     with open('writetest.py', 'w') as outf:
> for s in strings:
>             outf.write(s)
>     outf.write(L_SEP)
>
> Or something equivalent.
>
> If, however, the source strings come from a file you've created 
> somewhere (and are loaded by reading in that file line by line), then 
> I can see a problem.  DOS line endings are carriage returns ('\r\n'), 
> whereas standard UNIX files use just newlines ('\n').  Therefore, if 
> you are using the code:
>
> s.replace('\n', L_SEP)
>
> in Windows, using a Windows-generated file, then what you are likely 
> doing is converting the string sequence '\r\n' into '\r\r\n', which is 
> not what you want to do.  I can imagine some text editors interpreting 
> that as two endlines (since there are 2 \r's).  Indeed, when I execute 
> the code:
>
> >>> l = open('test.txt', 'w')
> >>> l.write('This is the first line\r\r\n')
> >>> l.write('This is the second\r\r\n')
> >>> l.close()
>
> on UNIX and open the resulting file in gedit, it is double-spaced, but 
> if I just dump it to the screen using 'cat', it is single-spaced.
>
> If you want to make your code a bit more cross-platform, you should 
> strip out all types of end line characters from the strings before you 
> write them.  So something like this:
>
> with open('writetest.py', 'w') as outf:
>     for s in strings:
> outf.write(s.rstrip('\r\n'))
>         outf.write(L_SEP)
>
> Hope this helps,
> Jason

The '\n' are in the original file.

I've tested these other versions:

-------------------------------
def write():
     strings = ['# -*- coding: utf-8 -*-\n',
                 'import os\n',
                 'import sys\n']
     with open('writetest.py', 'w') as outf:
         txt = L_SEP.join([s.rstip() for s in strings]):
         outf.write(txt)
------------------------------

-------------------------------
def write():
     strings = ['# -*- coding: utf-8 -*-',
                 'import os',
                 'import sys']
     with open('writetest.py', 'w') as outf:
         txt = L_SEP.join( strings):
         outf.write(txt)
------------------------------

Las, no changes, always correctly displayed in MS bloc-notes but with 
double line in other éditors.

-- 
Vincent V.V.
Oqapy <https://launchpad.net/oqapy> . Qarte 
<https://launchpad.net/qarte> . PaQager <https://launchpad.net/paqager>



More information about the Python-list mailing list