Search code examples
pythonline-endings

Preserve end-of-line style when working with files in python


I am looking for a way to ensure that the end-of-line style of a file is maintained in python program while reading, editing and writing.

Python has universal file ending support, which can convert all line endings to \n when the file is read, and then convert them all to the system default when the file is written. In my case I would like to still do the initial conversion, but then write the file with the original EOL style rather than the system default.

Is there a standard way to do this kind of thing? If not, is there a standard way to detect the EOL style of a file?

Assuming that there is no standard way to do this, a possible work flow would be:

  1. Read in a file in binary mode.
  2. Decode into utf-8 (or whatever encoding is required).
  3. Detect EOL style.
  4. Convert all line endings to \n.

  5. Do stuff with the file.

  6. Convert all line endings to original style.

  7. Encode file.
  8. Write file in binary mode.

In this work flow, what is the best way to do step 2?


Solution

  • Use python's universal newline support:

    f = open('randomthing.py', 'rU')
    fdata = f.read()
    newlines = f.newlines
    print repr(newlines)
    

    newlines contains the file's delimiter or a tuple of delimiters if the file uses a mix of delimiters.