.. _tut-io: **************** 输入和输出 **************** 一个程åºå¯ä»¥æœ‰å‡ ç§è¾“出方å¼ï¼šä»¥äººç±»å¯è¯»çš„æ–¹å¼æ‰“å°æ•°æ®ï¼Œæˆ–者写入一个文件供以åŽä½¿ç”¨ã€‚æœ¬ç« å°†è®¨è®ºå‡ ç§å¯èƒ½æ€§ã€‚ .. _tut-formatting: æ ¼å¼åŒ–输出 ========================= 我们有两ç§å¤§ç›¸å¾„åºåœ°è¾“出值方法:*表达å¼è¯å¥* å’Œ `print()`_ 函数(第三ç§è®¿æ±‚是使用文件对象的 :meth:`write` æ–¹æ³•ï¼Œæ ‡å‡†æ–‡ä»¶è¾“å‡ºå¯ä»¥å‚考 ``sys.stdout``,详细内容å‚è§åº“å‚考手册)。 é€šå¸¸ï¼Œä½ æƒ³è¦å¯¹è¾“出åšæ›´å¤šçš„æ ¼å¼æŽ§åˆ¶ï¼Œè€Œä¸æ˜¯ç®€å•çš„打å°ä½¿ç”¨ç©ºæ ¼åˆ†éš”的值。有两ç§æ–¹æ³•å¯ä»¥æ ¼å¼åŒ–ä½ çš„è¾“å‡ºï¼šç¬¬ä¸€ç§æ–¹æ³•æ˜¯ç”±ä½ 自己处ç†æ•´ä¸ªå—符串,通过使用å—符串切割和连接æ“作å¯ä»¥åˆ›å»ºä»»ä½•ä½ 想è¦çš„输出形å¼ã€‚string 类型包å«ä¸€äº›å°†å—符串填充到指定列宽度的有用æ“作,éšåŽå°±ä¼šè®¨è®ºè¿™äº›ã€‚第二ç§æ–¹æ³•æ˜¯ä½¿ç”¨ `str.format()`_ 方法。 æ ‡å‡†æ¨¡å— `string`_ 包括了一些æ“作,将å—符串填充入给定列时,这些æ“作很有用。éšåŽæˆ‘们会讨论这部分内容。第二ç§æ–¹æ³•æ˜¯ä½¿ç”¨ `Template`_ 方法。 当然,还有一个问题,如何将值转化为å—符串?很幸è¿ï¼ŒPython 有办法将任æ„值转为å—ç¬¦ä¸²ï¼šå°†å®ƒä¼ å…¥ `repr()`_ 或 `str()`_ 函数。 函数 `str()`_ 用于将值转化为适于人阅读的形å¼ï¼Œè€Œ `repr()`_ 转化为供解释器读å–çš„å½¢å¼ï¼ˆå¦‚果没有ç‰ä»·çš„è¯æ³•ï¼Œåˆ™ä¼šå‘生 `SyntaxError`_ 异常)æŸå¯¹è±¡æ²¡æœ‰é€‚于人阅读的解释形å¼çš„è¯ï¼Œ`str()`_ 会返回与 `repr()`_ ç‰åŒçš„值。很多类型,诸如数值或链表ã€å—å…¸è¿™æ ·çš„ç»“æž„ï¼Œé’ˆå¯¹å„函数都有ç€ç»Ÿä¸€çš„解读方å¼ã€‚å—符串和浮点数,有ç€ç‹¬ç‰¹çš„解读方å¼ã€‚ 下é¢æœ‰äº›ä¾‹å:: >>> s = 'Hello, world.' >>> str(s) 'Hello, world.' >>> repr(s) "'Hello, world.'" >>> str(1/7) '0.14285714285714285' >>> x = 10 * 3.25 >>> y = 200 * 200 >>> s = 'The value of x is ' + repr(x) + ', and y is ' + repr(y) + '...' >>> print(s) The value of x is 32.5, and y is 40000... >>> # The repr() of a string adds string quotes and backslashes: ... hello = 'hello, world\n' >>> hellos = repr(hello) >>> print(hellos) 'hello, world\n' >>> # The argument to repr() may be any Python object: ... repr((x, y, ('spam', 'eggs'))) "(32.5, 40000, ('spam', 'eggs'))" 有两ç§æ–¹å¼å¯ä»¥å†™å¹³æ–¹å’Œç«‹æ–¹è¡¨:: >>> for x in range(1, 11): ... print(repr(x).rjust(2), repr(x*x).rjust(3), end=' ') ... # Note use of 'end' on previous line ... print(repr(x*x*x).rjust(4)) ... 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 >>> for x in range(1, 11): ... print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x)) ... 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 (注æ„第一个例å,`print()`_ 在æ¯åˆ—ä¹‹é—´åŠ äº†ä¸€ä¸ªç©ºæ ¼ï¼Œå®ƒæ€»æ˜¯åœ¨å‚æ•°é—´åŠ å…¥ç©ºæ ¼ã€‚) 以上是一个 `str.rjust()`_ 方法的演示,它把å—符串输出到一列,并通过å‘å·¦ä¾§å¡«å……ç©ºæ ¼æ¥ä½¿å…¶å³å¯¹é½ã€‚类似的方法还有 `str.ljust()`_ å’Œ `str.center()`_。这些函数åªæ˜¯è¾“出新的å—符串,并ä¸æ”¹å˜ä»€ä¹ˆã€‚如果输出的å—符串太长,它们也ä¸ä¼šæˆªæ–å®ƒï¼Œè€Œæ˜¯åŽŸæ ·è¾“å‡ºï¼Œè¿™ä¼šä½¿ä½ çš„è¾“å‡ºæ ¼å¼å˜å¾—混乱,ä¸è¿‡æ€»å¼ºè¿‡å¦ä¸€ç§é€‰æ‹©ï¼ˆæˆªæ–å—ç¬¦ä¸²ï¼‰ï¼Œå› ä¸ºé‚£æ ·ä¼šäº§ç”Ÿé”™è¯¯çš„è¾“å‡ºå€¼ï¼ˆå¦‚æžœä½ ç¡®å®žéœ€è¦æˆªæ–它,å¯ä»¥ä½¿ç”¨åˆ‡å‰²æ“作,例如:``x.ljust(n)[:n]`` )。 还有å¦ä¸€ä¸ªæ–¹æ³•ï¼Œ `str.zfill()`_ 它用于å‘数值的å—符串表达左侧填充 0。该函数å¯ä»¥æ£ç¡®ç†è§£æ£è´Ÿå·:: >>> '12'.zfill(5) '00012' >>> '-3.14'.zfill(7) '-003.14' >>> '3.14159265359'.zfill(5) '3.14159265359' 方法 `str.format()`_ 的基本用法如下:: >>> print('We are the {} who say "{}!"'.format('knights', 'Ni')) We are the knights who say "Ni!" 大括å·å’Œå…¶ä¸çš„å—符会被替æ¢æˆä¼ å…¥ `str.format()`_ çš„å‚数。大括å·ä¸çš„æ•°å€¼æŒ‡æ˜Žä½¿ç”¨ä¼ å…¥ `str.format()`_ 方法的对象ä¸çš„哪一个:: >>> print('{0} and {1}'.format('spam', 'eggs')) spam and eggs >>> print('{1} and {0}'.format('spam', 'eggs')) eggs and spam 如果在 `str.format()`_ 调用时使用关键å—å‚数,å¯ä»¥é€šè¿‡å‚æ•°åæ¥å¼•ç”¨å€¼:: >>> print('This {food} is {adjective}.'.format( ... food='spam', adjective='absolutely horrible')) This spam is absolutely horrible. ä½ç½®å‚数和关键å—å‚æ•°å¯ä»¥éšæ„组åˆ:: >>> print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred', other='Georg')) The story of Bill, Manfred, and Georg. ``'!a'`` (应用 `ascii()`_),``'!s'`` (应用 `str()`_ )和 ``'!r'`` (应用 `repr()`_ )å¯ä»¥åœ¨æ ¼å¼åŒ–之å‰è½¬æ¢å€¼:: >>> import math >>> print('The value of PI is approximately {}.'.format(math.pi)) The value of PI is approximately 3.14159265359. >>> print('The value of PI is approximately {!r}.'.format(math.pi)) The value of PI is approximately 3.141592653589793. å—段ååŽå…许å¯é€‰çš„ ``':'`` å’Œæ ¼å¼æŒ‡ä»¤ã€‚è¿™å…è®¸å¯¹å€¼çš„æ ¼å¼åŒ–åŠ ä»¥æ›´æ·±å…¥çš„æŽ§åˆ¶ã€‚ä¸‹ä¾‹å°† Pi 转为三ä½ç²¾åº¦ã€‚ >>> import math >>> print('The value of PI is approximately {0:.3f}.'.format(math.pi)) The value of PI is approximately 3.142. 在å—段åŽçš„ ``':'`` åŽé¢åŠ 一个整数会é™å®šè¯¥å—段的最å°å®½åº¦ï¼Œè¿™åœ¨ç¾ŽåŒ–è¡¨æ ¼æ—¶å¾ˆæœ‰ç”¨:: >>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678} >>> for name, phone in table.items(): ... print('{0:10} ==> {1:10d}'.format(name, phone)) ... Jack ==> 4098 Dcab ==> 7678 Sjoerd ==> 4127 å¦‚æžœä½ æœ‰ä¸ªå®žåœ¨æ˜¯å¾ˆé•¿çš„æ ¼å¼åŒ–å—符串,ä¸æƒ³åˆ†å‰²å®ƒã€‚å¦‚æžœä½ å¯ä»¥ç”¨å‘½åæ¥å¼•ç”¨è¢«æ ¼å¼åŒ–çš„å˜é‡è€Œä¸æ˜¯ä½ç½®å°±å¥½äº†ã€‚有个简å•çš„方法,å¯ä»¥ä¼ 入一个å—典,用ä¸æ‹¬å·( ``'[]'`` )访问它的键:: >>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678} >>> print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; ' 'Dcab: {0[Dcab]:d}'.format(table)) Jack: 4098; Sjoerd: 4127; Dcab: 8637678 也å¯ä»¥ç”¨ ‘**’ æ ‡å¿—å°†è¿™ä¸ªå—典以关键å—å‚æ•°çš„æ–¹å¼ä¼ å…¥:: >>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678} >>> print('Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}'.format(**table)) Jack: 4098; Sjoerd: 4127; Dcab: 8637678 è¿™ç§æ–¹å¼ä¸Žæ–°çš„内置函数 `vars()`_ 组åˆä½¿ç”¨éžå¸¸æœ‰æ•ˆã€‚该函数返回包å«æ‰€æœ‰å±€éƒ¨å˜é‡çš„å—典。 è¦è¿›ä¸€æ¥äº†è§£å—ç¬¦ä¸²æ ¼å¼åŒ–方法 `str.format()`_,å‚è§ `æ ¼å¼å—符串è¯æ³•`_。 æ—§å¼çš„å—ç¬¦ä¸²æ ¼å¼åŒ– --------------------- æ“作符 ``%`` 也å¯ä»¥ç”¨äºŽå—ç¬¦ä¸²æ ¼å¼åŒ–。它以类似 :c:func:`sprintf`\ -style çš„æ–¹å¼è§£æžå·¦å‚数,将å³å‚数应用于æ¤ï¼Œå¾—åˆ°æ ¼å¼åŒ–æ“作生æˆçš„å—符串,例如:: >>> import math >>> print('The value of PI is approximately %5.3f.' % math.pi) The value of PI is approximately 3.142. 更多的信æ¯å¯ä»¥å‚è§ `printf-style String Formatting`_ 一节。 .. _tut-files: 文件读写 ========================= .. index:: builtin: open object: file 函数 `open()`_ 返回 `文件对象`_,通常的用法需è¦ä¸¤ä¸ªå‚数:``open(filename, mode)``。 :: >>> f = open('workfile', 'w') .. XXX str(f) is <io.TextIOWrapper object at 0x82e8dc4> >>> print(f) <open file 'workfile', mode 'w' at 80a0960> 第一个å‚数是一个å«æœ‰æ–‡ä»¶åçš„å—符串。第二个å‚数也是一个å—符串,å«æœ‰æè¿°å¦‚ä½•ä½¿ç”¨è¯¥æ–‡ä»¶çš„å‡ ä¸ªå—符。*mode* 为 ``'r'`` 时表示åªæ˜¯è¯»å–文件;``'w'`` 表示åªæ˜¯å†™å…¥æ–‡ä»¶ï¼ˆå·²ç»å˜åœ¨çš„åŒåæ–‡ä»¶å°†è¢«åˆ æŽ‰ï¼‰ï¼›``'a'`` è¡¨ç¤ºæ‰“å¼€æ–‡ä»¶è¿›è¡Œè¿½åŠ ï¼Œå†™å…¥åˆ°æ–‡ä»¶ä¸çš„任何数æ®å°†è‡ªåŠ¨æ·»åŠ 到末尾。 ``'r+'`` 表示打开文件进行读å–和写入。*mode* å‚数是å¯é€‰çš„,默认为 ``'r'``。 通常,文件以 :dfn:`文本` 打开,这æ„味ç€ï¼Œä½ 从文件读出和å‘文件写入的å—符串会被特定的编ç æ–¹å¼ï¼ˆé»˜è®¤æ˜¯UTF-8)编ç 。模å¼åŽé¢çš„ ``'b'`` 以 :dfn:`二进制模å¼` 打开文件:数æ®ä¼šä»¥å—节对象的形å¼è¯»å‡ºå’Œå†™å…¥ã€‚è¿™ç§æ¨¡å¼åº”该用于所有ä¸åŒ…å«æ–‡æœ¬çš„文件。 在文本模å¼ä¸‹ï¼Œè¯»å–时默认会将平å°æœ‰å…³çš„行结æŸç¬¦ï¼ˆUnix上是 ``\n`` , Windows上是 ``\r\n``)转æ¢ä¸º ``\n``。在文本模å¼ä¸‹å†™å…¥æ—¶ï¼Œé»˜è®¤ä¼šå°†å‡ºçŽ°çš„ ``\n`` 转æ¢æˆå¹³å°æœ‰å…³çš„行结æŸç¬¦ã€‚è¿™ç§æš—地里的修改对 ASCII 文本文件没有问题,但会æŸå :file:`JPEG` 或 :file:`EXE` è¿™æ ·çš„äºŒè¿›åˆ¶æ–‡ä»¶ä¸çš„æ•°æ®ã€‚使用二进制模å¼è¯»å†™æ¤ç±»æ–‡ä»¶æ—¶è¦ç‰¹åˆ«å°å¿ƒã€‚ .. _tut-filemethods: 文件对象方法 ----------------------- 本节ä¸çš„示例都默认文件对象 ``f`` å·²ç»åˆ›å»ºã€‚ è¦è¯»å–文件内容,需è¦è°ƒç”¨ ``f.read(size)``,该方法读å–若干数é‡çš„æ•°æ®å¹¶ä»¥å—符串形å¼è¿”回其内容,*size* 是å¯é€‰çš„数值,指定å—符串长度。如果没有指定 *size* 或者指定为负数,就会读å–并返回整个文件。当文件大å°ä¸ºå½“å‰æœºå™¨å†…å˜ä¸¤å€æ—¶ï¼Œå°±ä¼šäº§ç”Ÿé—®é¢˜ã€‚å之,会尽å¯èƒ½æŒ‰æ¯”较大的 *size* 读å–和返回数æ®ã€‚如果到了文件末尾,``f.read()`` 会返回一个空å—符串(``''``):: >>> f.read() 'This is the entire file.\n' >>> f.read() '' ``f.readline()`` 从文件ä¸è¯»å–å•ç‹¬ä¸€è¡Œï¼Œå—ç¬¦ä¸²ç»“å°¾ä¼šè‡ªåŠ¨åŠ ä¸Šä¸€ä¸ªæ¢è¡Œç¬¦ï¼ˆ ``\n`` ),åªæœ‰å½“文件最åŽä¸€è¡Œæ²¡æœ‰ä»¥æ¢è¡Œç¬¦ç»“尾时,这一æ“作æ‰ä¼šè¢«å¿½ç•¥ã€‚è¿™æ ·è¿”å›žå€¼å°±ä¸ä¼šæœ‰æ··æ·†ï¼Œå¦‚æžœ ``f.readline()`` 返回一个空å—符串,那就表示到达了文件末尾,如果是一个空行,就会æ述为 ``'\n'``,一个åªåŒ…å«æ¢è¡Œç¬¦çš„å—符串:: >>> f.readline() 'This is the first line of the file.\n' >>> f.readline() 'Second line of the file\n' >>> f.readline() '' ä½ å¯ä»¥å¾ªçŽ¯é历文件对象æ¥è¯»å–文件ä¸çš„æ¯ä¸€è¡Œã€‚这是一ç§å†…å˜é«˜æ•ˆã€å¿«é€Ÿï¼Œå¹¶ä¸”代ç 简介的方å¼:: >>> for line in f: ... print(line, end='') ... This is the first line of the file. Second line of the file å¦‚æžœä½ æƒ³æŠŠæ–‡ä»¶ä¸çš„所有行读到一个列表ä¸ï¼Œä½ 也å¯ä»¥ä½¿ç”¨ ``list(f)`` 或者 ``f.readlines()``。 ``f.write(string)`` 方法将 *string* 的内容写入文件,并返回写入å—符的长度:: >>> f.write('This is a test\n') 15 想è¦å†™å…¥å…¶ä»–éžå—符串内容,首先è¦å°†å®ƒè½¬æ¢ä¸ºå—符串:: >>> value = ('the answer', 42) >>> s = str(value) >>> f.write(s) 18 ``f.tell()`` 返回一个整数,代表文件对象在文件ä¸çš„指针ä½ç½®ï¼Œè¯¥æ•°å€¼è®¡é‡äº†è‡ªæ–‡ä»¶å¼€å¤´åˆ°æŒ‡é’ˆå¤„的比特数。需è¦æ”¹å˜æ–‡ä»¶å¯¹è±¡æŒ‡é’ˆè¯è¯ï¼Œä½¿ç”¨ ``f.seek(offset,from_what)``。指针在该æ“作ä¸ä»ŽæŒ‡å®šçš„引用ä½ç½®ç§»åŠ¨ *offset* 比特,引用ä½ç½®ç”± *from_what* å‚数指定。 *from_what* 值为 0 表示自文件起始处开始,1 表示自当å‰æ–‡ä»¶æŒ‡é’ˆä½ç½®å¼€å§‹ï¼Œ2 表示自文件末尾开始。*from_what* å¯ä»¥å¿½ç•¥ï¼Œå…¶é»˜è®¤å€¼ä¸ºé›¶ï¼Œæ¤æ—¶ä»Žæ–‡ä»¶å¤´å¼€å§‹:: >>> f = open('workfile', 'rb+') >>> f.write(b'0123456789abcdef') 16 >>> f.seek(5) # Go to the 6th byte in the file 5 >>> f.read(1) b'5' >>> f.seek(-3, 2) # Go to the 3rd byte before the end 13 >>> f.read(1) b'd' 在文本文件ä¸ï¼ˆæ²¡æœ‰ä»¥ ``b`` 模å¼æ‰“开),åªå…许从文件头开始寻找(有个例外是用 ``seek(0, 2)`` 寻找文件的最末尾处)而且åˆæ³•çš„ *å移* 值åªèƒ½æ˜¯ ``f.tell()`` 返回的值或者是零。其它任何 *å移* 值都会产生未定义的行为。 å½“ä½ ä½¿ç”¨å®Œä¸€ä¸ªæ–‡ä»¶æ—¶ï¼Œè°ƒç”¨ ``f.close()`` 方法就å¯ä»¥å…³é—它并释放其å 用的所有系统资æºã€‚ 在调用 ``f.close()`` 方法åŽï¼Œè¯•å›¾å†æ¬¡ä½¿ç”¨æ–‡ä»¶å¯¹è±¡å°†ä¼šè‡ªåŠ¨å¤±è´¥ã€‚ :: >>> f.close() >>> f.read() Traceback (most recent call last): File "<stdin>", line 1, in ? ValueError: I/O operation on closed file ç”¨å…³é”®å— `with`_ 处ç†æ–‡ä»¶å¯¹è±¡æ˜¯ä¸ªå¥½ä¹ 惯。它的先进之处在于文件用完åŽä¼šè‡ªåŠ¨å…³é—,就算å‘生异常也没关系。它是 `try`_\ -\ `finally`_ å—的简写:: >>> with open('workfile', 'r') as f: ... read_data = f.read() >>> f.closed True 文件对象还有一些ä¸å¤ªå¸¸ç”¨çš„é™„åŠ æ–¹æ³•ï¼Œæ¯”å¦‚ :meth:`~file.isatty` å’Œ :meth:`~file.truncate` 在库å‚考手册ä¸æœ‰æ–‡ä»¶å¯¹è±¡çš„完整指å—。 .. _tut-json: 使用 `json`_ å˜å‚¨ç»“æž„åŒ–æ•°æ® ------------------------------------------------------------------------------------------ .. index:: module: json 从文件ä¸è¯»å†™å—符串很容易。数值就è¦å¤šè´¹ç‚¹å„¿å‘¨æŠ˜ï¼Œå› 为 :meth:`read` 方法åªä¼šè¿”回å—ç¬¦ä¸²ï¼Œåº”å°†å…¶ä¼ å…¥ `int()`_ è¿™æ ·çš„å‡½æ•°ï¼Œå°±å¯ä»¥å°† ``'123'`` è¿™æ ·çš„å—符串转æ¢ä¸ºå¯¹åº”的数值 123ã€‚å½“ä½ æƒ³è¦ä¿å˜æ›´ä¸ºå¤æ‚çš„æ•°æ®ç±»åž‹ï¼Œä¾‹å¦‚嵌套的列表和å—典,手工解æžå’Œåºåˆ—化它们将å˜å¾—æ›´å¤æ‚。 好在用户ä¸æ˜¯éžå¾—自己编写和调试ä¿å˜å¤æ‚æ•°æ®ç±»åž‹çš„代ç ,Python å…è®¸ä½ ä½¿ç”¨å¸¸ç”¨çš„æ•°æ®äº¤æ¢æ ¼å¼ `JSON(JavaScript Object Notation)`_ã€‚æ ‡å‡†æ¨¡å— `json`_ å¯ä»¥æŽ¥å— Python æ•°æ®ç»“构,并将它们转æ¢ä¸ºå—符串表示形å¼ï¼›æ¤è¿‡ç¨‹ç§°ä¸º **åºåˆ—化**。从å—符串表示形å¼é‡æ–°æž„建数æ®ç»“构称为 **ååºåˆ—化**。åºåˆ—化和ååºåˆ—化的过程ä¸ï¼Œè¡¨ç¤ºè¯¥å¯¹è±¡çš„å—符串å¯ä»¥å˜å‚¨åœ¨æ–‡ä»¶æˆ–æ•°æ®ä¸ï¼Œä¹Ÿå¯ä»¥é€šè¿‡ç½‘ç»œè¿žæŽ¥ä¼ é€ç»™è¿œç¨‹çš„机器。 .. note:: JSON æ ¼å¼ç»å¸¸ç”¨äºŽçŽ°ä»£åº”用程åºä¸è¿›è¡Œæ•°æ®äº¤æ¢ã€‚许多程åºå‘˜éƒ½å·²ç»ç†Ÿæ‚‰å®ƒäº†ï¼Œä½¿å®ƒæˆä¸ºç›¸äº’å作的一个ä¸é”™çš„选择。 å¦‚æžœä½ æœ‰ä¸€ä¸ªå¯¹è±¡ ``x``ï¼Œä½ å¯ä»¥ç”¨ç®€å•çš„一行代ç 查看其 JSON å—符串表示形å¼:: >>> json.dumps([1, 'simple', 'list']) '[1, "simple", "list"]' `dumps()`_ 函数的å¦å¤–一个å˜ä½“ `dump()`_,直接将对象åºåˆ—化到一个文件。所以如果 ``f`` 是为写入而打开的一个 `文件对象`_,我们å¯ä»¥è¿™æ ·åš:: json.dump(x, f) 为了é‡æ–°è§£ç 对象,如果 ``f`` 是为读å–而打开的 `文件对象`_:: x = json.load(f) è¿™ç§ç®€å•çš„åºåˆ—化技术å¯ä»¥å¤„ç†åˆ—表和å—典,但åºåˆ—化任æ„类实例为 JSON 需è¦ä¸€ç‚¹é¢å¤–的努力。 `json`_ 模å—的手册对æ¤æœ‰è¯¦ç»†çš„解释。 .. seealso:: `pickle`_ - pickle æ¨¡å— ä¸Ž :ref:`JSON <tut-json>` ä¸åŒï¼Œ*pickle* 是一个å议,它å…许任æ„å¤æ‚çš„ Python 对象的åºåˆ—åŒ–ã€‚å› æ¤ï¼Œå®ƒåªèƒ½ç”¨äºŽ Python 而ä¸èƒ½ç”¨æ¥ä¸Žå…¶ä»–è¯è¨€ç¼–写的应用程åºè¿›è¡Œé€šä¿¡ã€‚默认情况下它也是ä¸å®‰å…¨çš„:如果数æ®ç”±ç†Ÿç»ƒçš„攻击者精心设计, ååºåˆ—化æ¥è‡ªä¸€ä¸ªä¸å—ä¿¡ä»»æºçš„ pickle æ•°æ®å¯ä»¥æ‰§è¡Œä»»æ„代ç 。 .. _print(): https://docs.python.org/3/library/functions.html#print .. _str.format(): https://docs.python.org/3/library/stdtypes.html#str.format .. _string: https://docs.python.org/3/library/string.html#module-string .. _Template: https://docs.python.org/3/library/string.html#string.Template .. _repr(): https://docs.python.org/3/library/functions.html#repr .. _str(): https://docs.python.org/3/library/stdtypes.html#str .. _SyntaxError: https://docs.python.org/3/library/exceptions.html#SyntaxError .. _str.rjust(): https://docs.python.org/3/library/stdtypes.html#str.rjust .. _str.ljust(): https://docs.python.org/3/library/stdtypes.html#str.ljust .. _str.center(): https://docs.python.org/3/library/stdtypes.html#str.center .. _str.zfill(): https://docs.python.org/3/library/stdtypes.html#str.zfill .. _ascii(): https://docs.python.org/3/library/functions.html#ascii .. _vars(): https://docs.python.org/3/library/functions.html#vars .. _æ ¼å¼å—符串è¯æ³•: https://docs.python.org/3/library/string.html#formatstrings .. _printf-style String Formatting: https://docs.python.org/3/library/stdtypes.html#old-string-formatting .. _open(): https://docs.python.org/3/library/functions.html#open .. _文件对象: https://docs.python.org/3/glossary.html#term-file-object .. _with: https://docs.python.org/3/reference/compound_stmts.html#with .. _try: https://docs.python.org/3/reference/compound_stmts.html#try .. _finally: https://docs.python.org/3/reference/compound_stmts.html#finally .. _json: https://docs.python.org/3/library/json.html#module-json .. _int(): https://docs.python.org/3/library/functions.html#int .. _JSON(JavaScript Object Notation): http://json.org/ .. _dumps(): https://docs.python.org/3/library/json.html#json.dumps .. _dump(): https://docs.python.org/3/library/json.html#json.dump .. _pickle: https://docs.python.org/3/library/pickle.html#module-pickle