7. Input and Output

7. 输入输出

There are several ways to present the output of a program; data can be printed in a human-readable form, or written to a file for future use. This chapter will discuss some of the possibilities.
有几种方法可以显示程序的输出;数据可以以人类可读的形式打印出来,或者写入文件以供将来使用。本章将讨论一些可能性。



7.1. Fancier Output Formatting

7.1. 更漂亮的输出格式

So far we've encountered two ways of writing values: expression statements and the "print()" function. (A third way is using the "write()" method of file objects; the standard output file can be referenced as "sys.stdout". See the Library Reference for more information on this.)
到目前为止,我们遇到了两种写入值的方法:表达式语句 和 "print()" 函数。(第三种是使用文件对象的 "write()" 方法;标准输出文件可以作为"sys.stdout" 引用。更多相关信息可参考标准库指南。)

Often you'll want more control over the formatting of your output than simply printing space-separated values. There are several ways to format output.
通常,你需要更多地控制输出的格式,而不仅仅是打印空格分隔的值。有几种格式化输出的方法。

• To use formatted string literals, begin a string with "f" or "F" before the opening quotation mark or triple quotation mark. Inside this string, you can write a Python expression between "{" and "}" characters that can refer to variables or literal values.
• 要使用 格式字字符串字面值 ,请在字符串的开始引号或三引号之前加上一个 "f" 或 "F" 。在此字符串中,你可以在 "{" 和 "}" 字符之间写可以引用的 变量或字面值的 Python 表达式。

     >>> year = 2016 
>>> event = 'Referendum'
>>> f'Results of the {year} {event}'
'Results of the 2016 Referendum'
• The "str.format()" method of strings requires more manual effort. You'll still use "{" and "}" to mark where a variable will be substituted and can provide detailed formatting directives, but you'll also need to provide the information to be formatted.
• 字符串的 "str.format()" 方法需要更多的手动操作。你仍将使用 "{" 和"}" 来标记变量将被替换的位置,并且可以提供详细的格式化指令,但你还需要提供要格式化的信息。

     >>> yes_votes = 42_572_654 
>>> no_votes = 43_132_495
>>> percentage = yes_votes / (yes_votes + no_votes)
>>> '{:-9} YES votes {:2.2%}'.format(yes_votes, percentage)
' 42572654 YES votes 49.67%'
• Finally, you can do all the string handling yourself by using string slicing and concatenation operations to create any layout you can imagine. The string type has some methods that perform useful operations for padding strings to a given column width.
• 最后,你可以使用字符串切片和连接操作自己完成所有的字符串处理,以创建 你可以想象的任何布局。字符串类型有一些方法可以执行将字符串填充到给定 列宽的有用操作。

When you don't need fancy output but just want a quick display of some variables for debugging purposes, you can convert any value to a string with the "repr()" or "str()" functions.
当你不需要花哨的输出而只是想快速显示某些变量以进行调试时,可以使用"repr()" or "str()" 函数将任何值转化为字符串。

The "str()" function is meant to return representations of values which are fairly human-readable, while "repr()" is meant to generate representations which can be read by the interpreter (or will force a "SyntaxError" if there is no equivalent syntax). For objects which don't have a particular representation for human consumption, "str()" will return the same value as "repr()". Many values, such as numbers or structures like lists and dictionaries, have the same representation using either function. Strings, in particular, have two distinct representations.
"str()" 函数是用于返回人类可读的值的表示,而 "repr()" 是用于生成解释器可读的表示(如果没有等效的语法,则会强制执行 "SyntaxError")对于没有人类可读性的表示的对象, "str()" 将返回和 "repr()" 一样的值。很多值使用任一函数都具有相同的表示,比如数字或类似列表和字典的结构。特殊的是字符串有两个不同的表示。

Some examples:
几个例子:

   >>> 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'))"
The "string" module contains a "Template" class that offers yet another way to substitute values into strings, using placeholders like "$x" and replacing them with values from a dictionary, but offers much less control of the formatting.
"string" 模块包含一个 "Template" 类,它提供了另一种将值替换为字符串的方法,使用类似 "$x" 的占位符并用字典中的值替换它们,但对格式的控制要少的多。



7.1.1. Formatted String Literals

7.1.1. 格式化字符串文字

Formatted string literals (also called f-strings for short) let you include the value of Python expressions inside a string by prefixing the string with "f" or "F" and writing expressions as "{expression}".
格式化字符串字面值 (常简称为 f-字符串)能让你在字符串前加上 "f" 和"F" 并将表达式写成 "{expression}" 来在字符串中包含 Python 表达式的值。

An optional format specifier can follow the expression. This allows greater control over how the value is formatted. The following example rounds pi to three places after the decimal:
可选的格式说明符可以跟在表达式后面。这样可以更好地控制值的格式化方式。以下示例将pi舍入到小数点后三位:

   >>> import math 
>>> print(f'The value of pi is approximately {math.pi:.3f}.')
The value of pi is approximately 3.142.
Passing an integer after the "':'" will cause that field to be a minimum number of characters wide. This is useful for making columns line up.
在 "':'" 后传递一个整数可以让该字段成为最小字符宽度。这在使列对齐时很有用。:

   >>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678} 
>>> for name, phone in table.items():
... print(f'{name:10} ==> {phone:10d}')
...
Sjoerd ==> 4127
Jack ==> 4098
Dcab ==> 7678
Other modifiers can be used to convert the value before it is formatted. "'!a'" applies "ascii()", "'!s'" applies "str()", and "'!r'" applies "repr()":
其他的修饰符可用于在格式化之前转化值。 "'!a'" 应用 "ascii()" ,"'!s'"应用 "str()",还有 "'!r'" 应用 "repr()":

   >>> animals = 'eels' 
>>> print(f'My hovercraft is full of {animals}.')
My hovercraft is full of eels.
>>> print(f'My hovercraft is full of {animals!r}.')
My hovercraft is full of 'eels'.
For a reference on these format specifications, see the reference guide for the Format Specification Mini-Language.
有关这些格式规范的参考,请参阅参考指南 格式规格迷你语言。



7.1.2. The String format() Method

7.1.2. 字符串的 format() 方法

Basic usage of the "str.format()" method looks like this:
"str.format()" 方法的基本用法如下所示:

   >>> print('We are the {} who say "{}!"'.format('knights', 'Ni')) 
We are the knights who say "Ni!"
The brackets and characters within them (called format fields) are replaced with the objects passed into the "str.format()" method. A number in the brackets can be used to refer to the position of the object passed into the "str.format()" method.
花括号和其中的字符(称为格式字段)将替换为传递给 "str.format()" 方法的对象。花括号中的数字可用来表示传递给 "str.format()" 方法的对象的位置。

   >>> print('{0} and {1}'.format('spam', 'eggs')) 
spam and eggs
>>> print('{1} and {0}'.format('spam', 'eggs'))
eggs and spam
If keyword arguments are used in the "str.format()" method, their values are referred to by using the name of the argument.
如果在 "str.format()" 方法中使用关键字参数,则使用参数的名称引用它们的值。:

   >>> print('This {food} is {adjective}.'.format( 
... food='spam', adjective='absolutely horrible'))
This spam is absolutely horrible.
Positional and keyword arguments can be arbitrarily combined:
位置和关键字参数可以任意组合:

   >>> print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred', 
other='Georg'))
The story of Bill, Manfred, and Georg.
If you have a really long format string that you don't want to split up, it would be nice if you could reference the variables to be formatted by name instead of by position. This can be done by simply passing the dict and using square brackets "'[]'" to access the keys
如果你有一个非常长的格式字符串,你不想把它拆开,那么你最好按名称而不是位置引用变量来进行格式化。这可以通过简单地传递字典和使用方括号 "'[]'"访问键来完成:

   >>> 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
This could also be done by passing the table as keyword arguments with the '**' notation.
这也可以通过使用 '**' 符号将表作为关键字参数传递。:

   >>> 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
This is particularly useful in combination with the built-in function "vars()", which returns a dictionary containing all local variables.
这在与内置函数 "vars()" 结合使用时非常有用,它会返回包含所有局部变量的字典。

As an example, the following lines produce a tidily-aligned set of columns giving integers and their squares and cubes:
例如,下面几行代码生成一组整齐的列,其中包含给定的整数和它的平方以及立方:

   >>> 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
For a complete overview of string formatting with "str.format()", see Format String Syntax.
关于使用 "str.format()" 进行字符串格式化的完整概述,请参阅 格式字符串语法 。



7.1.3. Manual String Formatting

7.1.3. 手动格式化字符串

Here's the same table of squares and cubes, formatted manually:
这是同一个平方和立方的表,手动格式化的:

   >>> 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
(Note that the one space between each column was added by the way "print()" works: it always adds spaces between its arguments.)
(注意每列之间的一个空格是通过使用 "print()" 的方式添加的:它总是在其参数间添加空格。)

The "str.rjust()" method of string objects right-justifies a string in a field of a given width by padding it with spaces on the left. There are similar methods "str.ljust()" and "str.center()". These methods do not write anything, they just return a new string. If the input string is too long, they don't truncate it, but return it unchanged; this will mess up your column lay-out but that's usually better than the alternative, which would be lying about a value. (If you really want truncation you can always add a slice operation, as in "x.ljust(n)[:n]".)
字符串对象的 "str.rjust()" 方法通过在左侧填充空格来对给定宽度的字段中的字符串进行右对齐。类似的方法还有 "str.ljust()" 和 "str.center()" 。这些方法不会写入任何东西,它们只是返回一个新的字符串,如果输入的字符串太长,它们不会截断字符串,而是原样返回;这虽然会弄乱你的列布局,但这通常比另一种方法好,后者会在显示值时可能不准确(如果你真的想截断,你可以添加一个切片操作,例如 "x.ljust(n)[:n]" 。)

There is another method, "str.zfill()", which pads a numeric string on the left with zeros. It understands about plus and minus signs:
还有另外一个方法,"str.zfill()" ,它会在数字字符串的左边填充零。它能识别正负号:

   >>> '12'.zfill(5) 
'00012'
>>> '-3.14'.zfill(7)
'-003.14'
>>> '3.14159265359'.zfill(5)
'3.14159265359'

7.1.4. Old string formatting

7.1.4. 旧的字符串格式化方法

The "%" operator can also be used for string formatting. It interprets the left argument much like a "sprintf()"-style format string to be applied to the right argument, and returns the string resulting from this formatting operation. For example:
"%" 操作符也可以用作字符串格式化。它将左边的参数解释为一个很像"sprintf()" 风格 的格式字符串,应用到右边的参数,并返回一个由此格式化操作产生的字符串。例如:

   >>> import math 
>>> print('The value of pi is approximately %5.3f.' % math.pi)
The value of pi is approximately 3.142.
More information can be found in the printf-style String Formatting section.
可在 printf 风格的字符串格式化 部分找到更多信息。



7.2. Reading and Writing Files

7.2. 读写文件

"open()" returns a file object, and is most commonly used with two arguments: "open(filename, mode)".
"open()" 返回一个 file object,最常用的有两个参数: "open(filename,mode)"。

   >>> f = open('workfile', 'w') 
The first argument is a string containing the filename. The second argument is another string containing a few characters describing the way in which the file will be used. mode can be "'r'" when the file will only be read, "'w'" for only writing (an existing file with the same name will be erased), and "'a'" opens the file for appending; any data written to the file is automatically added to the end. "'r+'" opens the file for both reading and writing. The mode argument is optional; "'r'" will be assumed if it's omitted.
第一个参数是包含文件名的字符串。第二个参数是另一个字符串,其中包含一些描述文件使用方式的字符。mode 可以是 "'r'" ,表示文件只能读取,"'w'"表示只能写入(已存在的同名文件会被删除),还有 "'a'" 表示打开文件以追加内容;任何写入的数据会自动添加到文件的末尾。"'r+'" 表示打开文件进行读写。mode 参数是可选的;省略时默认为 "'r'"。

Normally, files are opened in text mode, that means, you read and write strings from and to the file, which are encoded in a specific encoding. If encoding is not specified, the default is platform dependent (see "open()"). "'b'" appended to the mode opens the file in binary mode: now the data is read and written in the form of bytes objects. This mode should be used for all files that don't contain text.
通常文件是以 text mode 打开的,这意味着从文件中读取或写入字符串时,都会以指定的编码方式进行编码。如果未指定编码格式,默认值与平台相关 (参见 "open()")。在mode 中追加的 "'b'" 则以 binary mode 打开文件:现在数据是以字节对象的形式进行读写的。这个模式应该用于所有不包含文本的文件。

In text mode, the default when reading is to convert platform-specific line endings ("\n" on Unix, "\r\n" on Windows) to just "\n". When writing in text mode, the default is to convert occurrences of "\n" back to platform-specific line endings. This behind-the-scenes modification to file data is fine for text files, but will corrupt binary data like that in "JPEG" or "EXE" files. Be very careful to use binary mode when reading and writing such files.
在文本模式下读取时,默认会把平台特定的行结束符 (Unix 上的 "\n",Windows 上的 "\r\n") 转换为 "\n"。在文本模式下写入时,默认会把出现的"\n" 转换回平台特定的结束符。这样在幕后修改文件数据对文本文件来说没有问题,但是会破坏二进制数据例如 "JPEG" 或 "EXE" 文件中的数据。请一定要注意在读写此类文件时应使用二进制模式。

It is good practice to use the "with" keyword when dealing with file objects. The advantage is that the file is properly closed after its suite finishes, even if an exception is raised at some point. Using "with" is also much shorter than writing equivalent "try"-"finally" blocks:
在处理文件对象时,最好使用 "with" 关键字。 优点是当子句体结束后文件会正确关闭,即使在某个时刻引发了异常。 而且使用 "with" 相比等效的"try"-"finally" 代码块要简短得多:

   >>> with open('workfile') as f: 
... read_data = f.read()
>>> # We can check that the file has been automatically closed.
>>> f.closed
True
If you're not using the "with" keyword, then you should call "f.close()" to close the file and immediately free up any system resources used by it. If you don't explicitly close a file, Python's garbage collector will eventually destroy the object and close the open file for you, but the file may stay open for a while. Another risk is that different Python implementations will do this clean-up at different times.
如果你没有使用 "with" 关键字,那么你应该调用 "f.close()" 来关闭文件并立即释放它使用的所有系统资源。如果你没有显式地关闭文件,Python的垃圾回收器最终将销毁该对象并为你关闭打开的文件,但这个文件可能会保持打开状态一段时间。另外一个风险是不同的Python实现会在不同的时间进行清理。

After a file object is closed, either by a "with" statement or by calling "f.close()", attempts to use the file object will automatically fail.
通过 "with" 语句或者调用 "f.close()" 关闭文件对象后,尝试使用该文件对象将自动失败。:

   >>> f.close() 
>>> f.read()
Traceback (most recent call last):
File "", line 1, in
ValueError: I/O operation on closed file.

7.2.1. Methods of File Objects

7.2.1. 文件对象的方法

The rest of the examples in this section will assume that a file object called "f" has already been created.
本节中剩下的例子将假定你已创建名为 "f" 的文件对象。

To read a file's contents, call "f.read(size)", which reads some quantity of data and returns it as a string (in text mode) or bytes object (in binary mode). size is an optional numeric argument. When size is omitted or negative, the entire contents of the file will be read and returned; it's your problem if the file is twice as large as your machine's memory. Otherwise, at most size characters (in text mode) or size bytes (in binary mode) are read and returned. If the end of the file has been reached, "f.read()" will return an empty string ("''").
要读取文件内容,请调用 "f.read(size)",它会读取一些数据并将其作为字符串(在文本模式下)或字节串对象(在二进制模式下)返回。 size 是一个可选的数值参数。 当 size 被省略或者为负数时,将读取并返回整个文件的内容;如果文件的大小是你的机器内存的两倍就会出现问题。 当取其他值时,将读取并返回至多 size 个字符(在文本模式下)或 size 个字节(在二进制模式下)。 如果已到达文件末尾,"f.read()" 将返回一个空字符串 ("''")。

   >>> f.read() 
'This is the entire file.\n'
>>> f.read()
''
"f.readline()" reads a single line from the file; a newline character ("\n") is left at the end of the string, and is only omitted on the last line of the file if the file doesn't end in a newline. This makes the return value unambiguous; if "f.readline()" returns an empty string, the end of the file has been reached, while a blank line is represented by "'\n'", a string containing only a single newline.
"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 reading lines from a file, you can loop over the file object. This is memory efficient, fast, and leads to simple code:
要从文件中读取行,你可以循环遍历文件对象。这是内存高效,快速的,并简化代码:

   >>> for line in f: 
... print(line, end='')
...
This is the first line of the file.
Second line of the file
If you want to read all the lines of a file in a list you can also use "list(f)" or "f.readlines()".
如果你想以列表的形式读取文件中的所有行,你也可以使用 "list(f)" 或"f.readlines()"。

"f.write(string)" writes the contents of string to the file, returning the number of characters written.
"f.write(string)" 会把 string 的内容写入到文件中,并返回写入的字符数。:

   >>> f.write('This is a test\n') 
15
Other types of objects need to be converted -- either to a string (in text mode) or a bytes object (in binary mode) -- before writing them:
在写入其他类型的对象之前,需要先把它们转化为字符串(在文本模式下)或者字节对象(在二进制模式下):

   >>> value = ('the answer', 42) 
>>> s = str(value) # convert the tuple to string
>>> f.write(s)
18
"f.tell()" returns an integer giving the file object's current position in the file represented as number of bytes from the beginning of the file when in binary mode and an opaque number when in text mode.
"f.tell()" 返回一个整数,给出文件对象在文件中的当前位置,表示为二进制模式下时从文件开始的字节数,以及文本模式下的不透明数字。

To change the file object's position, use "f.seek(offset, whence)". The position is computed from adding offset to a reference point; the reference point is selected by the whence argument. A whence value of 0 measures from the beginning of the file, 1 uses the current file position, and 2 uses the end of the file as the reference point. whence can be omitted and defaults to 0, using the beginning of the file as the reference point.
To change the file object's position, use "f.seek(offset, whence)".The position is computed from adding offset to a reference point;the reference point is selected by the whence argument. A whencevalue of 0 measures from the beginning of the file, 1 uses the currentfile position, and 2 uses the end of the file as the reference point.whence can be omitted and defaults to 0, using the beginning of thefile as the reference point.

   >>> 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'
In text files (those opened without a "b" in the mode string), only seeks relative to the beginning of the file are allowed (the exception being seeking to the very file end with "seek(0, 2)") and the only valid offset values are those returned from the "f.tell()", or zero. Any other offset value produces undefined behaviour.
在文本文件(那些在模式字符串中没有 "b" 的打开的文件)中,只允许相对于文件开头搜索(使用 "seek(0, 2)" 搜索到文件末尾是个例外)并且唯一有效的offset 值是那些能从 "f.tell()" 中返回的或者是零。其他 offset 值都会产生未定义的行为。

File objects have some additional methods, such as "isatty()" and "truncate()" which are less frequently used; consult the Library Reference for a complete guide to file objects.
文件对象有一些额外的方法,例如 "isatty()" 和 "truncate()" ,它们使用频率较低;有关文件对象的完整指南请参阅库参考。



7.2.2. Saving structured data with "json"

7.2.2. 使用 "json" 保存结构化数据

Strings can easily be written to and read from a file. Numbers take a bit more effort, since the "read()" method only returns strings, which will have to be passed to a function like "int()", which takes a string like "'123'" and returns its numeric value 123. When you want to save more complex data types like nested lists and dictionaries, parsing and serializing by hand becomes complicated.
字符串可以很轻松地写入文件并从文件中读取出来。数字可能会费点劲,因为"read()" 方法只能返回字符串,这些字符串必须传递给类似 "int()" 的函数,它会接受类似 "'123'" 这样的字符串并返回其数字值 123。当你想保存诸如嵌套列表和字典这样更复杂的数据类型时,手动解析和序列化会变得复杂。

Rather than having users constantly writing and debugging code to save complicated data types to files, Python allows you to use the popular data interchange format called JSON (JavaScript Object Notation). The standard module called "json" can take Python data hierarchies, and convert them to string representations; this process is called serializing. Reconstructing the data from the string representation is called deserializing. Between serializing and deserializing, the string representing the object may have been stored in a file or data, or sent over a network connection to some distant machine.
Python 允许你使用称为 JSON (JavaScript Object Notation) 的流行数据交换格式,而不是让用户不断的编写和调试代码以将复杂的数据类型保存到文件中。名为 "json" 的标准模块可以采用 Python 数据层次结构,并将它们转化为字符串表示形式;这个过程称为 serializing 。从字符串表示中重建数据称为deserializing 。在序列化和反序列化之间,表示对象的字符串可能已存储在文件或数据中,或通过网络连接发送到某个远程机器。

Note: The JSON format is commonly used by modern applications to allow for data exchange. Many programmers are already familiar with it, which makes it a good choice for interoperability.
注解: JSON格式通常被现代应用程序用于允许数据交换。许多程序员已经熟悉它,这 使其成为互操作性的良好选择。

If you have an object "x", you can view its JSON string representation with a simple line of code:
如果你有一个对象 "x" ,你可以用一行简单的代码来查看它的 JSON 字符串表示:

   >>> import json 
>>> json.dumps([1, 'simple', 'list'])
'[1, "simple", "list"]'
Another variant of the "dumps()" function, called "dump()", simply serializes the object to a text file. So if "f" is a text file object opened for writing, we can do this:
"dumps()" 函数的另一个变体叫做 "dump()" ,它只是将对象序列化为 textfile 。因此,如果 "f" 是一个 text file 对象,我们可以这样做:

   json.dump(x, f) 
To decode the object again, if "f" is a text file object which has been opened for reading:
要再次解码对象,如果 "f" 是一个打开的以供阅读的 text file 对象:

   x = json.load(f) 
This simple serialization technique can handle lists and dictionaries, but serializing arbitrary class instances in JSON requires a bit of extra effort. The reference for the "json" module contains an explanation of this.
这种简单的序列化技术可以处理列表和字典,但是在JSON中序列化任意类的实例需要额外的努力。 "json" 模块的参考包含对此的解释。

See also: "pickle" - the pickle module
参见: "pickle" - 封存模块

Contrary to JSON, pickle is a protocol which allows the serialization of arbitrarily complex Python objects. As such, it is specific to Python and cannot be used to communicate with applications written in other languages. It is also insecure by default: deserializing pickle data coming from an untrusted source can execute arbitrary code, if the data was crafted by a skilled attacker.
与 JSON 不同,pickle 是一种允许对任意复杂 Python 对象进行序列化的协议。因此,它为 Python 所特有,不能用于与其他语言编写的应用程序通信。默认情况下它也是不安全的:如果数据是由熟练的攻击者精心设计的,则反序列化来自不受信任来源的 pickle 数据可以执行任意代码。

results matching ""

    No results matching ""