2017-01-25 12 views
3

Мой скрипт python генерирует json-файл. И я должен поддерживать этот файл python, работающий на windows и linux. Проблема заключается в возврате каретки разворота на windows и linux. Когда я запускаю этот код в окнах, он выводит CRLF json. И он выводит LF json, когда я запускаю это на linux.Как явно установить возврат каретки при выполнении json.dump?

Итак, как явно задать возврат каретки при выполнении json dump в python3.5? Я 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

+0

Возможно, имеет смысл конвертировать концы строк отдельно после создания файла. Или, что еще лучше, просто используйте код для завершения строки, чтобы прочитать его на другом конце; большинство программ, которые читают JSON, должны иметь возможность справиться с незнакомой линией, заканчивающейся так или иначе. – BrenBarn

+0

В пробельных символах JSON, в том числе '\ n' и' \ r' и игнорируются вне токенов и запрещены (кроме пространства) внутри токенов. Таким образом, использование строк в Windows или UNIX не имеет значения. –

ответ

4

Если вы настаиваете на последовательное поведение CRLF (спецификация JSON требует парсеров для обработки обоих, но, открыв его в некоторых простых текстовых читателей, как Блокнот может быть проще, с последовательным CRLF), решение в the open function, не json модуль.

Просто передайте newline='\r\n' в open, и он будет переводить любой \n написанный json в \r\n легко на всех системах, а не поведение по умолчанию перевод на os.linesep (который \r\n на Windows, и \n на большинстве других операционных систем):

with open(fpath, 'w', encoding="utf-8", newline='\r\n') as outfile: 
    json.dump(data, outfile, indent=4, sort_keys=True, ensure_ascii=False) 
+0

Действительно! Я хочу установить LF, так что я мог бы это понять с помощью newline = '\ n \' – jef

+1

@jef: Ах, ваш вопрос заставил вас походить на вас, как будто вы вернулись. Да, если вам просто нужен фид строки, используйте 'newline = ''' или 'newline = '\ n'', причем любой из которых отключает перевод строки окончания (последний явно говорит« перевод LF в LF », первый говорит: не переводить ", но это логически эквивалентное поведение). – ShadowRanger

2

линия окончаний белое пространство в JSon спецификации (https://tools.ietf.org/html/rfc7159 секции 2 в нижней части):

Незначительное пробельные допускается до или после любой из шести структурные признаки.

ws = *(
      %x20/   ; Space 
      %x09/   ; Horizontal tab 
      %x0A/   ; Line feed or New line 
      %x0D)    ; Carriage return 

что означает, что каждый читатель должен обрабатывать как CR и LF, чтобы быть совместимыми.