@@ -23,19 +23,21 @@ def read(file_path, encoding='utf-8'):
2323 with open (file_path , 'r' , encoding = encoding ) as file :
2424 return json5 .load (file )
2525
26- def write (file_path , data , encoding = 'utf-8' , ensure_ascii = False , style = 'pretty' ):
26+ def write (file_path , data , encoding = 'utf-8' , ensure_ascii = False , style = 'pretty' , atomic = True ):
27+ from . import file
2728 Path (file_path ).parent .mkdir (parents = True , exist_ok = True )
28- with open (file_path , 'w' , encoding = encoding ) as file :
29- if style == 'pretty' : # single key/val spans multi-lines
30- json .dump (data , file , indent = 2 , ensure_ascii = ensure_ascii )
31- elif style == 'compact' : # single key/val per line
32- file .write ('{\n ' )
33- items = list (data .items ())
34- for idx , (key , val ) in enumerate (items ):
35- line_end = ',' if idx < len (items ) - 1 else ''
36- inner = f'{{ { json .dumps (val , ensure_ascii = ensure_ascii )[1 :- 1 ]} }}'
37- file .write (f' "{ key } ": { inner } { line_end } \n ' )
38- file .write ('}' )
39- else : # minified to single line
40- json .dump (data , file , separators = (',' , ':' ), ensure_ascii = ensure_ascii )
41- file .write ('\n ' ) # trailing newline
29+ if style == 'pretty' : # single key/val spans multi-lines
30+ json_str = json .dumps (data , indent = 2 , ensure_ascii = ensure_ascii )
31+ elif style == 'compact' : # single key/val per line
32+ lines = ['{' ]
33+ items = list (data .items ())
34+ for idx , (key , val ) in enumerate (items ):
35+ line_end = ',' if idx < len (items ) - 1 else ''
36+ inner = f'{{ { json .dumps (val , ensure_ascii = ensure_ascii )[1 :- 1 ]} }}'
37+ lines .append (f' "{ key } ": { inner } { line_end } ' )
38+ lines .append ('}' )
39+ json_str = '\n ' .join (lines )
40+ else : # minified
41+ json_str = json .dumps (data , separators = (',' , ':' ), ensure_ascii = ensure_ascii )
42+ json_str += '\n '
43+ getattr (file , 'atomic_write' if atomic else 'write' )(file_path , json_str , encoding = encoding )
0 commit comments