Python 2.7 basic tutorial: input and output

黄舟
Release: 2016-12-24 17:12:50
Original
1806 people have browsed it

.. _tut-io:

******************************************

Input and Output input and output

******************************************

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.

There are several ways to express program output Result; data can be printed to human-readable form or written to a file for later use. This chapter discusses several alternative methods.

.. _tut-formatting:

Fancier Output Formatting Play with the output format

================================== ==============

So far we've encountered two ways of writing values: *expression statements* and

the :keyword:`print` statement. (A third way is using the :meth:`write` method

of file objects; the standard output file can be referenced as ``sys.stdout``.

See the Library Reference for more information on this.)

We have two very different The output value methods: *expression statement* and :keyword:`print` statement. (The third type of access

is to use the :meth:`write` method of the file object. For standard file output, please refer to

``sys.stdout``. For details, please refer to the library reference manual.)

.. index:: module: string

Often you'll want more control over the formatting of your output than simply

printing space-separated values. There are two ways to format your output; the

first way is to do all the string handling yourself ; using string slicing and

concatenation operations you can create any layout you can imagine. The

standard module :mod:`string` contains some useful operations for padding

strings to a given column width; these will be discussed shortly. The second

way is to use the :meth:`str.format` method.

Perhaps you often want to do some more complex control over the output format than simply printing the space delimiter. There are

two ways to format the output. The first is that you control the entire string, and you can use character cutting and concatenation operations to create any output form you want. The standard module :mod:`string` includes a number of operations that are useful when filling strings into given columns. We'll discuss this later.

The second method is to use the :meth:`str.format` method.

One question remains, of course: how do you convert values ​​to strings? Fortunately,

Python has ways to convert any value to a string: pass it to the :func:`repr`

or :func:`str ` functions.

Of course, there is another question, how to convert the value into a string? Fortunately, Python has a way to convert any

value to a string: pass it into the :func:`repr` or :func:`str` function.

The :func:`str` function is meant to return representations of values ​​which are

fairly human-readable, while :func:`repr` is meant to generate representations

which can be read by the interpreter (or will force a :exc:`SyntaxError` if

there is not equivalent syntax). For objects which don't have a particular

representation for human consumption, :func:`str` will return the same value as

:func :`repr`. Many values, such as numbers or structures like lists and

dictionaries, have the same representation using either function. Strings and

floating point numbers, in particular, have two distinct representations.

function:func: `str` is used to convert the value into a form suitable for human reading, and :func:`repr` is converted into a form readable by the interpreter (if there is no equivalent syntax, a :exc:`SyntaxError will occur `Exception) If an object does not have a human-readable interpretation form, :func:`str` will return a value equivalent to :func:`repr`. Many types, such as numerical values ​​or structures such as linked lists and dictionaries, have a unified interpretation method for each function. Strings and

floating point numbers have unique interpretation methods.

Some examples:

The following are some examples::

>>> s = 'Hello, world.'

>>> str(s)

'Hello, world.'

>> /7.0)

'0.14285714285714285'

>>> t; 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'))"

Here are two ways to write a table of squares and cubes:

有两种方式可以写平方和立方表 ::

   >>> for x in range(1, 11):

   ...     print repr(x).rjust(2), repr(x*x).rjust(3),

   ...     # Note trailing comma 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

(Note that in the first example, one space between each column was added by the

way :keyword:`print` works: it always adds spaces between its arguments.)

(注意第一个例子, :keyword:`print` 在每列之间加了一个空格,它总是在参

数间加入空格。)

This example demonstrates the :meth:`rjust` method of string objects, which

right-justifies a string in a field of a given width by padding it with spaces

on the left.  There are similar methods :meth:`ljust` and :meth:`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]``.)

以上是一个 :meth:`rjust` 方法的演示,它把字符串输出到一列,并通过向左

侧填充空格来使其右对齐。类似的方法还有 :meth:`ljust` 和 :meth:`center`

。这些函数只是输出新的字符串,并不改变什么。如果输出的字符串太长,它们也不会截断

它,而是原样输出,这会使你的输出格式变得混乱,不过总强过另一种选择(截

断字符串),因为那样会产生错误的输出值。(如果你确实需要截断它,可以使

用切割操作,例如: ``x.ljust( n)[:n]`` 。)

There is another method, :meth:`zfill`, which pads a numeric string on the left

with zeros.  It understands about plus and minus signs:

还有另一个方法, :meth:`zfill` 它用于向数值的字符串表达左侧填充 0。该

函数可以正确理解正负号 ::

   >>> '12'.zfill(5)

   '00012'

   >>> '-3.14'.zfill(7)

   '-003.14'

   >>> '3.14159265359'.zfill(5)

   '3.14159265359'

Basic usage of the :meth:`str.format` method looks like this:

方法 :meth:`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 :meth:`~str.format` method.  A number in the

brackets refers to the position of the object passed into the

:meth:`~str.format` method. :

大括号和其中的字符会被替换成传入 :meth:`~str.format` 的参数。大括号中

的数值指明使用传入 :meth:`~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 :meth:`~str.format` method, their values

are referred to by using the name of the argument. :

If you use keyword arguments when calling :meth:`~str.format`, you can reference the

value by the parameter name::

>>> print 'This {food} is { adjective}.'.format(

... food='spam', adjective='absolutely horrible')

This spam is absolutely horrible.

Positional and keyword arguments can be arbitrarily combined:

Positioning and keywords Parameters can be used in combination::

>>> print 'The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred',

... ='Georg')

The story of Bill, Manfred, and Georg.

``'!s'`` (apply :func:`str`) and ``'!r'`` (apply :func: `repr`) can be used to

convert the value before it is formatted. :

``'!s'`` (applies to:func:`str` ) and ``'!r'`` (applies to: func:`repr` ) can

convert the value before formatting. ::

>>> 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.

An optional ``':'`` and format specifier can follow the field name. This allows

greater control over how the value is formatted. The following example

truncates Pi to three places after the decimal. ` and format directives. This allows for deeper

control over the formatting of values. The following example converts Pi to three digits of precision. ::

>>> import math

>>> print 'The value of PI is approximately {0:.3f}.'.format(math.pi)

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 tables pretty. :

``'' after the field :'`` Adding an integer after it will limit the minimum width of the field, which is very useful when beautifying tables. ::

>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}

>>> for name, phone in table.items():

 ... print '{0:10} ==> {1:10d}'.format(name, phone)

  ... 7678

Sjoerd ==> 4127

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:

If you have a really long format string and don't want to split it. It would be nice if you could refer to the

formatted variable by name instead of position. There is a simple way to pass in a dictionary and access its keys using

brackets::

>>> 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. Use the '**' flag to pass this dictionary as a keyword argument. ::

>>> 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 new built-in: func:`vars`

function, which returns a dictionary containing all local variables.

This approach works very well in combination with the new built-in function :func:`vars`. This function returns a dictionary containing all local variables.

For a complete overview of string formatting with :meth:`str.format`, see

:ref:`formatstrings`.

For a complete overview of string formatting with :meth:`str.format`, see

:ref:`formatstrings` .

Old string formatting Old string formatting

---------------------------------------- -----

The ``%`` operator can also be used for string formatting. It interprets the

left argument much like a :cfunc:`sprintf`/ -style format string to be applied

to the right argument, and returns the string resulting from this formatting

operation. For example:

operator ``%`` can also be used for string formatting. It parses the left argument in a way similar to :cfunc:`sprintf`, applies the right argument to it, and gets the string generated by the formatting operation, for example::

>>> import math

> >> print 'The value of PI is approximately %5.3f.' % math.pi

The value of PI is approximately 3.142.

Since :meth:`str.format` is quite new, a lot of Python code still uses the ``%``

operator. However, because this old style of formatting will eventually be

removed from the language, :meth:`str.format` should generally be used.

because :meth: `str.format` is still very new, and a lot of Python code still uses the ``%`` operator.

However, since the old formatting methods will eventually be removed from the language,

  :meth:`str.format` should be used whenever possible.

More information can be found in the :ref:`string-formatting` section.

Further information can be found in the :ref:`string-formatting` section.

.. _tut-files:

Reading and Writing Files Reading and Writing Files

================================ ===============

.. index::

builtin: open

object: file

:func:`open` returns a file object, and is most commonly used with two

arguments: ``open(filename, mode)``.

Function:func:`open` returns the file object. Common usage requires two parameters:

``open(filename, mode)`` .

::

>>> f = open('/tmp/workfile', 'w')

>>> print f

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.

The first parameter is a string identifying the file name. The second parameter is a character string consisting of a limited number of letters, describing how the file will be used. Optional *modes* are: ``'r'``, this option makes the file read-only;

``'w'``, this option makes the file write-only (for files with the same name, this operation makes the original file overwritten); ``'a'``,

This option opens the file in append mode; ``'r+'``, this option opens the file in read-write mode;

*mode* parameter is optional. If not specified, defaults to ``'r'`` mode.

On Windows, ``'b'`` appended to the mode opens the file in binary mode, so there

are also modes like ``'rb'``, ``'wb'``, and `` 'r+b'``. Python on Windows makes

a distinction between text and binary files; the end-of-line characters in text

files are automatically altered slightly when data is read or written. This

behind- the-scenes modification to file data is fine for ASCII text files, but

it'll corrupt binary data like that in :file:`JPEG` or :file:`EXE` files. Be

very careful to use binary mode when reading and writing such files. On Unix,

it doesn't hurt to append a ``'b'`` to the mode, so you can use it

platform-independently for all binary files.

On Windows On the platform, the ``'b'`` mode opens the file in binary mode, so there may

be similar to ``'rb'``, ``'wb'``, ``'r+b'`` Wait for the combination of modes. There is a difference between text files and binary files on the Windows platform. When reading and writing text files, line terminators are automatically added to the end of the lines. This kind of backstage fucking

The operation method has no problem with ASCII text files, but it will cause damage when operating binary

files such as JPEG or .EXE. When operating these files, be sure to open them in binary mode. On

Unix, it is also harmless to add a ``'b'`` mode, so you can use it platform-independently in all binary file processing.

.. _tut-filemethods:

Methods of File Objects File object methods

---------------------------------- ----------

The rest of the examples in this section will assume that a file object called

``f`` has already been created.

The examples in this section are all default file objects ``f`` has been created.

To read a file's contents, call ``f.read(size)``, which reads some quantity of

data and returns it as a string. *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* bytes are read and returned. If the end of

the file has been reached, ``f.read()`` will return an empty string (``""``).

To read the file content, you need to call ``f.read( size)``, this method reads a certain amount of data and returns its content in the form of a character string. *size* is an optional value that specifies the length of the string. If

size is not specified or is specified as a negative number, the entire file will be read and returned. Problems arise when the file size is twice

times the current machine memory. On the contrary, data will be read and returned as large as possible.

If the end of the file is reached, f.read() will return an empty string ("").

::

>>> 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()`` reads a single line from the file, and a newline is automatically added to the end of the string character

( ``/n`` ), this operation will be ignored only if the last line of the file does not end with a newline character.

This way there will be no confusion about the return value. If ``f.readline()`` returns an empty string, it means

that the end of the file has been reached. If it is a blank line, it will be described as ` `'/n`` , a string containing only newlines. ::

>>> f.readline()

'This is the first line of the file./n'

>>> f.readline()

'Second line of the file/n'

>>> f.readline()

''

``f.readlines()`` returns a list containing all the lines of data in the file.

If given an optional parameter *sizehint*, it reads that many bytes from the

file and enough more to complete a line, and returns the lines from that. This

is often used to allow efficient reading of a large file by lines, but without

having to load the entire file in memory. Only complete lines will be returned.

f.readlines() returns a list containing all the data lines in the file. If the

*sizehint* parameter is given, more than one line of bits will be read in and multiple lines of text will be returned. This feature

is typically used to efficiently read large line files, avoiding the need to read the entire file into memory. This operation only returns complete rows. ::

>>> f.readlines()

['This is the first line of the file./n', 'Second line of the file/n']

An alternative approach to reading lines is to loop over the file object. This is easy to remember, fast and the code is simpler::

>>> for line in f:

print line,

This is the first line of the file.

Second line of the file

The alternative approach is simpler but does not provide as fine-grained

control. Since the two approaches manage line buffering differently, they

should not be mixed.

This approach is simple but does not provide complete control of the operation. Because the two methods manage buffers in different ways, they cannot be mixed.

``f.write(string)`` writes the contents of *string* to the file, returning

``None``.  

``f.write(string)`` 将 *string* 的内容写入文件,返回 ``None`` 。 ::

   >>> f.write('This is a test/n')

To write something other than a string, it needs to be converted to a string

first:

如果需要写入字符串以外的数据,就要先把这些数据转换为字符串。 ::

   >>> value = ('the answer', 42)

   >>> s = str(value)

   >>> f.write(s)

``f.tell()`` returns an integer giving the file object's current position in the

file, measured in bytes from the beginning of the file.  To change the file

object's position, use ``f.seek(offset, from_what)``.  The position is computed

from adding *offset* to a reference point; the reference point is selected by

the *from_what* argument.  A *from_what* 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.  *from_what* can be omitted and defaults to 0, using the

beginning of the file as the reference point. 

``f.tell()`` 返回一个整数,代表文件对象在文件中的指针位置,该数值计量了自文

件开头到指针处的比特数。需要改变文件对象指针话话,使用

``f.seek(offset,from_what)`` 。指针在该操作中从指定的引用位置移动 *offset*

比特,引用位置由 *from_what* 参数指定。 *from_what* 值为 0 表示自文件

起始处开始,1 表示自当前文件指针位置开始,2 表示自文件末尾开始。 *from_what* 可以

忽略,其默认值为零,此时从文件头开始。 ::

   >>> f = open('/tmp/workfile', 'r+')

   >>> f.write('0123456789abcdef')

   >>> f.seek(5)     # Go to the 6th byte in the file

   >>> f.read(1)

   '5'

   >>> f.seek(-3, 2) # Go to the 3rd byte before the end

   >>> f.read(1)

   'd'

When you're done with a file, call ``f.close()`` to close it and free up any

system resources taken up by the open file.  After calling ``f.close()``,

attempts to use the file object will automatically fail. 

文件使用完后,调用 ``f.close()`` 可以关闭文件,释放打开文件后占用的系统资源。

调用 ``f.close()`` 之后,再调用文件对象会自动引发错误。 ::

   >>> f.close()

   >>> f.read()

   Traceback (most recent call last):

     File "", line 1, in ?

   ValueError: I/O operation on closed file

It is good practice to use the :keyword:`with` keyword when dealing with file

objects.  This has the advantage that the file is properly closed after its

suite finishes, even if an exception is raised on the way.  It is also much

shorter than writing equivalent :keyword:`try`/ -/ :keyword:`finally` blocks

用关键字 :keyword:`with` 处理文件对象是个好习惯。它的先进之处在于文件

用完后会自动关闭,就算发生异常也没关系。它是 :keyword:`try`/ -/

:keyword:`finally` 块的简写。 ::

    >>> with open('/tmp/workfile', 'r') as f:

    ...     read_data = f.read()

    >>> f.closed

    True

File objects have some additional methods, such as :meth:`~file.isatty` and

:meth:`~file.truncate` which are less frequently used; consult the Library

Reference for a complete guide to file objects.

文件对象还有一些不太常用的附加方法,比如 :meth:`~file.isatty` 和 :meth:`~file.truncate` 在库参

考手册中有文件对象的完整指南。

.. _tut-pickle:

The :mod:`pickle` Module   :mod:`pickle` 模块

------------------------------------------------

.. index:: module: pickle

Strings can easily be written to and read from a file. Numbers take a bit more

effort, since the :meth:`read` method only returns strings, which will have to

be passed to a function like :func:`int`, which takes a string like ``'123'``

and returns its numeric value 123.  However, when you want to save more complex

data types like lists, dictionaries, or class instances, things get a lot more

complicated.

We can easily read and write strings in files. Numerical values ​​require a little more trouble, because the :meth:`read`

method will only return a string. It should be passed into a method like :func:`int`, and then the

``'123 Characters like '`` are converted to the corresponding value 123. However, things become more complicated when you need to save more complex data types, such as lists, dictionaries, and class instances.

Rather than have users be constantly writing and debugging code to save

complicated data types, Python provides a standard module called :mod:`pickle`.

This is an amazing module that can take almost any Python object (even some

forms of Python code!), and convert it to a string representation; this process

is called :dfn:`pickling`. Reconstructing the object from the string

representation is called :dfn:`unpickling`. Between pickling and unpickling,

the string representing the object may have been stored in a file or data, or

sent over a network connection to some distant machine.

Fortunately, users do not have to write and debug to save complex data types themselves. code. Python provides

a standard module called :mod:`pickle`. This is an amazing module that can express almost any

Python object (even some Python code snippets!) as a string, a process called

encapsulation ( :dfn:`pickling` ). Reconstructing an object from a string expression is called unpickling ( :dfn:`unpickling` ). Objects in the encapsulated state can be stored in files or objects, and can also be transferred between remote machines through the network.

If you have an object ``x``, and a file object ``f`` that's been opened for

writing, the simplest way to pickle the object takes only one line of code

If you have an object ``x``, a file object ``f`` opened in write mode, the simplest

method to encapsulate an object only requires one line of code::

pickle.dump(x, f)

To unpickle the object again, if ``f`` is a file object which has been opened

for reading

If ``f`` is a file object opened in read mode, you can reload and unpack this object::

x = pickle.load(f)

(There are other variants of this, used when pickling many objects or when you

don't want to write the pickled data to a file; consult the complete

documentation for : mod:`pickle` in the Python Library Reference.)

(If you don’t want to write the packed data to a file, there are some other variations available. The complete

:mod:`pickle` documentation can be found in the Python Library Reference. manual).

:mod:`pickle` is the standard way to make Python objects which can be stored and

reused by other programs or by a future invocation of the same program; the

technical term for this is a :dfn:` persistent` object. Because :mod:`pickle` is

so widely used, many authors who write Python extensions take care to ensure

that new data types such as matrices can be properly pickled and unpickled.

:mod:` pickle` is a standard way of storing Python objects for later use by other programs or itself. Providing

this set of technologies is a :dfn:`persistent` object. Because :mod:`pickle` is widely used, many Python extension authors pay great attention to whether new data types like matrices are suitable for packaging and unpacking.

The above is the basic tutorial of Python 2.7: input and output content. For more related content, please pay attention to the PHP Chinese website (m.sbmmt.com)!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!