• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1.. _tut-brieftour:
2
3**********************************
4Brief Tour of the Standard Library
5**********************************
6
7
8.. _tut-os-interface:
9
10Operating System Interface
11==========================
12
13The :mod:`os` module provides dozens of functions for interacting with the
14operating system::
15
16   >>> import os
17   >>> os.getcwd()      # Return the current working directory
18   'C:\\Python37'
19   >>> os.chdir('/server/accesslogs')   # Change current working directory
20   >>> os.system('mkdir today')   # Run the command mkdir in the system shell
21   0
22
23Be sure to use the ``import os`` style instead of ``from os import *``.  This
24will keep :func:`os.open` from shadowing the built-in :func:`open` function which
25operates much differently.
26
27.. index:: builtin: help
28
29The built-in :func:`dir` and :func:`help` functions are useful as interactive
30aids for working with large modules like :mod:`os`::
31
32   >>> import os
33   >>> dir(os)
34   <returns a list of all module functions>
35   >>> help(os)
36   <returns an extensive manual page created from the module's docstrings>
37
38For daily file and directory management tasks, the :mod:`shutil` module provides
39a higher level interface that is easier to use::
40
41   >>> import shutil
42   >>> shutil.copyfile('data.db', 'archive.db')
43   'archive.db'
44   >>> shutil.move('/build/executables', 'installdir')
45   'installdir'
46
47
48.. _tut-file-wildcards:
49
50File Wildcards
51==============
52
53The :mod:`glob` module provides a function for making file lists from directory
54wildcard searches::
55
56   >>> import glob
57   >>> glob.glob('*.py')
58   ['primes.py', 'random.py', 'quote.py']
59
60
61.. _tut-command-line-arguments:
62
63Command Line Arguments
64======================
65
66Common utility scripts often need to process command line arguments. These
67arguments are stored in the :mod:`sys` module's *argv* attribute as a list.  For
68instance the following output results from running ``python demo.py one two
69three`` at the command line::
70
71   >>> import sys
72   >>> print(sys.argv)
73   ['demo.py', 'one', 'two', 'three']
74
75The :mod:`getopt` module processes *sys.argv* using the conventions of the Unix
76:func:`getopt` function.  More powerful and flexible command line processing is
77provided by the :mod:`argparse` module.
78
79
80.. _tut-stderr:
81
82Error Output Redirection and Program Termination
83================================================
84
85The :mod:`sys` module also has attributes for *stdin*, *stdout*, and *stderr*.
86The latter is useful for emitting warnings and error messages to make them
87visible even when *stdout* has been redirected::
88
89   >>> sys.stderr.write('Warning, log file not found starting a new one\n')
90   Warning, log file not found starting a new one
91
92The most direct way to terminate a script is to use ``sys.exit()``.
93
94
95.. _tut-string-pattern-matching:
96
97String Pattern Matching
98=======================
99
100The :mod:`re` module provides regular expression tools for advanced string
101processing. For complex matching and manipulation, regular expressions offer
102succinct, optimized solutions::
103
104   >>> import re
105   >>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
106   ['foot', 'fell', 'fastest']
107   >>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
108   'cat in the hat'
109
110When only simple capabilities are needed, string methods are preferred because
111they are easier to read and debug::
112
113   >>> 'tea for too'.replace('too', 'two')
114   'tea for two'
115
116
117.. _tut-mathematics:
118
119Mathematics
120===========
121
122The :mod:`math` module gives access to the underlying C library functions for
123floating point math::
124
125   >>> import math
126   >>> math.cos(math.pi / 4)
127   0.70710678118654757
128   >>> math.log(1024, 2)
129   10.0
130
131The :mod:`random` module provides tools for making random selections::
132
133   >>> import random
134   >>> random.choice(['apple', 'pear', 'banana'])
135   'apple'
136   >>> random.sample(range(100), 10)   # sampling without replacement
137   [30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
138   >>> random.random()    # random float
139   0.17970987693706186
140   >>> random.randrange(6)    # random integer chosen from range(6)
141   4
142
143The :mod:`statistics` module calculates basic statistical properties
144(the mean, median, variance, etc.) of numeric data::
145
146    >>> import statistics
147    >>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
148    >>> statistics.mean(data)
149    1.6071428571428572
150    >>> statistics.median(data)
151    1.25
152    >>> statistics.variance(data)
153    1.3720238095238095
154
155The SciPy project <https://scipy.org> has many other modules for numerical
156computations.
157
158.. _tut-internet-access:
159
160Internet Access
161===============
162
163There are a number of modules for accessing the internet and processing internet
164protocols. Two of the simplest are :mod:`urllib.request` for retrieving data
165from URLs and :mod:`smtplib` for sending mail::
166
167   >>> from urllib.request import urlopen
168   >>> with urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl') as response:
169   ...     for line in response:
170   ...         line = line.decode('utf-8')  # Decoding the binary data to text.
171   ...         if 'EST' in line or 'EDT' in line:  # look for Eastern Time
172   ...             print(line)
173
174   <BR>Nov. 25, 09:43:32 PM EST
175
176   >>> import smtplib
177   >>> server = smtplib.SMTP('localhost')
178   >>> server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
179   ... """To: jcaesar@example.org
180   ... From: soothsayer@example.org
181   ...
182   ... Beware the Ides of March.
183   ... """)
184   >>> server.quit()
185
186(Note that the second example needs a mailserver running on localhost.)
187
188
189.. _tut-dates-and-times:
190
191Dates and Times
192===============
193
194The :mod:`datetime` module supplies classes for manipulating dates and times in
195both simple and complex ways. While date and time arithmetic is supported, the
196focus of the implementation is on efficient member extraction for output
197formatting and manipulation.  The module also supports objects that are timezone
198aware. ::
199
200   >>> # dates are easily constructed and formatted
201   >>> from datetime import date
202   >>> now = date.today()
203   >>> now
204   datetime.date(2003, 12, 2)
205   >>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
206   '12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'
207
208   >>> # dates support calendar arithmetic
209   >>> birthday = date(1964, 7, 31)
210   >>> age = now - birthday
211   >>> age.days
212   14368
213
214
215.. _tut-data-compression:
216
217Data Compression
218================
219
220Common data archiving and compression formats are directly supported by modules
221including: :mod:`zlib`, :mod:`gzip`, :mod:`bz2`, :mod:`lzma`, :mod:`zipfile` and
222:mod:`tarfile`. ::
223
224   >>> import zlib
225   >>> s = b'witch which has which witches wrist watch'
226   >>> len(s)
227   41
228   >>> t = zlib.compress(s)
229   >>> len(t)
230   37
231   >>> zlib.decompress(t)
232   b'witch which has which witches wrist watch'
233   >>> zlib.crc32(s)
234   226805979
235
236
237.. _tut-performance-measurement:
238
239Performance Measurement
240=======================
241
242Some Python users develop a deep interest in knowing the relative performance of
243different approaches to the same problem. Python provides a measurement tool
244that answers those questions immediately.
245
246For example, it may be tempting to use the tuple packing and unpacking feature
247instead of the traditional approach to swapping arguments. The :mod:`timeit`
248module quickly demonstrates a modest performance advantage::
249
250   >>> from timeit import Timer
251   >>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
252   0.57535828626024577
253   >>> Timer('a,b = b,a', 'a=1; b=2').timeit()
254   0.54962537085770791
255
256In contrast to :mod:`timeit`'s fine level of granularity, the :mod:`profile` and
257:mod:`pstats` modules provide tools for identifying time critical sections in
258larger blocks of code.
259
260
261.. _tut-quality-control:
262
263Quality Control
264===============
265
266One approach for developing high quality software is to write tests for each
267function as it is developed and to run those tests frequently during the
268development process.
269
270The :mod:`doctest` module provides a tool for scanning a module and validating
271tests embedded in a program's docstrings.  Test construction is as simple as
272cutting-and-pasting a typical call along with its results into the docstring.
273This improves the documentation by providing the user with an example and it
274allows the doctest module to make sure the code remains true to the
275documentation::
276
277   def average(values):
278       """Computes the arithmetic mean of a list of numbers.
279
280       >>> print(average([20, 30, 70]))
281       40.0
282       """
283       return sum(values) / len(values)
284
285   import doctest
286   doctest.testmod()   # automatically validate the embedded tests
287
288The :mod:`unittest` module is not as effortless as the :mod:`doctest` module,
289but it allows a more comprehensive set of tests to be maintained in a separate
290file::
291
292   import unittest
293
294   class TestStatisticalFunctions(unittest.TestCase):
295
296       def test_average(self):
297           self.assertEqual(average([20, 30, 70]), 40.0)
298           self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
299           with self.assertRaises(ZeroDivisionError):
300               average([])
301           with self.assertRaises(TypeError):
302               average(20, 30, 70)
303
304   unittest.main()  # Calling from the command line invokes all tests
305
306
307.. _tut-batteries-included:
308
309Batteries Included
310==================
311
312Python has a "batteries included" philosophy.  This is best seen through the
313sophisticated and robust capabilities of its larger packages. For example:
314
315* The :mod:`xmlrpc.client` and :mod:`xmlrpc.server` modules make implementing
316  remote procedure calls into an almost trivial task.  Despite the modules
317  names, no direct knowledge or handling of XML is needed.
318
319* The :mod:`email` package is a library for managing email messages, including
320  MIME and other :rfc:`2822`-based message documents. Unlike :mod:`smtplib` and
321  :mod:`poplib` which actually send and receive messages, the email package has
322  a complete toolset for building or decoding complex message structures
323  (including attachments) and for implementing internet encoding and header
324  protocols.
325
326* The :mod:`json` package provides robust support for parsing this
327  popular data interchange format.  The :mod:`csv` module supports
328  direct reading and writing of files in Comma-Separated Value format,
329  commonly supported by databases and spreadsheets.  XML processing is
330  supported by the :mod:`xml.etree.ElementTree`, :mod:`xml.dom` and
331  :mod:`xml.sax` packages. Together, these modules and packages
332  greatly simplify data interchange between Python applications and
333  other tools.
334
335* The :mod:`sqlite3` module is a wrapper for the SQLite database
336  library, providing a persistent database that can be updated and
337  accessed using slightly nonstandard SQL syntax.
338
339* Internationalization is supported by a number of modules including
340  :mod:`gettext`, :mod:`locale`, and the :mod:`codecs` package.
341