Reputation: 4083
My python script generates json file. And I have to support this python file working on windows and linux. The problem is a difference carriage return on windows and linux. When I run this code on windows, it outputs CRLF json. And it outputs LF json when I run this on linux.
So how to explicitly set carriage return when doing json dump in python3.5? I couln
import json
fpath = "hoge.json"
data = {"AGE": 12, "HOGE": [{"GUA": 3}]}
with open(fpath, 'wt', encoding="utf-8") as outfile:
json.dump(data, outfile, indent=4, sort_keys=True, ensure_ascii=False)
http://docs.python.jp/3/library/json.html
Upvotes: 10
Views: 13760
Reputation: 27360
Line endings are white space in the Json spec (https://www.rfc-editor.org/rfc/rfc7159 section 2 at the bottom):
Insignificant whitespace is allowed before or after any of the six structural characters.
ws = *( %x20 / ; Space %x09 / ; Horizontal tab %x0A / ; Line feed or New line %x0D ) ; Carriage return
This means that every reader must handle both CR and LF to be conformant.
Upvotes: 2
Reputation: 155734
If you insist on consistent CRLF behavior (the JSON spec requires parsers to handle both, but opening it in certain plain text readers like Notepad might be easier with consistent CRLF), the solution is in the open
function, not the json
module.
Just pass newline='\r\n'
to open
, and it will translate any \n
written by json
to \r\n
seamlessly on all systems, rather than the default behavior of translating to os.linesep
(which is \r\n
on Windows and \n
on most other OSes):
with open(fpath, 'w', encoding="utf-8", newline='\r\n') as outfile:
json.dump(data, outfile, indent=4, sort_keys=True, ensure_ascii=False)
Upvotes: 15